aboutsummaryrefslogtreecommitdiff
path: root/binary_search_tool/README.bisect
diff options
context:
space:
mode:
Diffstat (limited to 'binary_search_tool/README.bisect')
-rw-r--r--binary_search_tool/README.bisect213
1 files changed, 213 insertions, 0 deletions
diff --git a/binary_search_tool/README.bisect b/binary_search_tool/README.bisect
new file mode 100644
index 00000000..e6185e8a
--- /dev/null
+++ b/binary_search_tool/README.bisect
@@ -0,0 +1,213 @@
+
+bisect.py is a wrapper around the general purpose binary_search_state.py. It
+provides a user friendly interface for bisecting various compilation errors.
+The 2 currently provided methods of bisecting are ChromeOS package and object
+bisection. Each method defines a default set of options to pass to
+binary_search_state.py and allow the user to override these defaults (see
+the "Overriding" section).
+
+** NOTE **
+All commands, examples, scripts, etc. are to be run from your chroot unless
+stated otherwise.
+
+Bisection Methods:
+
+1) ChromeOS Package:
+ This method will bisect across all packages in a ChromeOS repository and find
+ the offending packages (according to your test script). This method takes the
+ following arguments:
+
+ board: The board to bisect on. For example: daisy, falco, etc.
+ remote: The IP address of the physical machine you're using to test with.
+
+ By default the ChromeOS package method will do a simple interactive test that
+ pings the machine and prompts the user if the machine is good.
+
+ a) Setup:
+ The ChromeOS package method requires that you have three build trees:
+
+ /build/${board}.bad - The build tree for your "bad" build
+ /build/${board}.good - The build tree for your "good" build
+ /build/${board}.work - A full copy of /build/${board}.bad
+
+ b) Cleanup:
+ bisect.py does most cleanup for you, the only thing required by the user is
+ to cleanup all built images and the three build trees made in /build/
+
+ c) Default Arguments:
+ --get_initial_items='cros_pkg/get_initial_items.sh'
+ --switch_to_good='cros_pkg/switch_to_good.sh'
+ --switch_to_bad='cros_pkg/switch_to_bad.sh'
+ --test_setup_script='cros_pkg/test_setup.sh'
+ --test_script='cros_pkg/interactive_test.sh'
+ --incremental
+ --prune
+ --file_args
+
+ d) Additional Documentation:
+ See ./cros_pkg/README.cros_pkg_triage for full documentation of ChromeOS
+ package bisection.
+
+ e) Examples:
+ i) Basic interactive test package bisection, on daisy board:
+ ./bisect.py package daisy 172.17.211.184
+
+ ii) Basic boot test package bisection, on daisy board:
+ ./bisect.py package daisy 172.17.211.184 -t cros_pkg/boot_test.sh
+
+2) ChromeOS Object:
+ This method will bisect across all objects in a ChromeOS package and find
+ the offending objects (according to your test script). This method takes the
+ following arguments:
+
+ board: The board to bisect on. For example: daisy, falco, etc.
+ remote: The IP address of the physical machine you're using to test with.
+ package: The package to bisect with. For example: chromeos-chrome
+ dir: (Optional) the directory for your good/bad build trees. Defaults to
+ $BISECT_DIR or /tmp/sysroot_bisect. This value will set $BISECT_DIR
+ for all bisecting scripts.
+
+ By default the ChromeOS object method will do a simple interactive test that
+ pings the machine and prompts the user if the machine is good.
+
+ a) Setup:
+ The ChromeOS package method requires that you populate your good and bad set
+ of objects. sysroot_wrapper will automatically detect the BISECT_STAGE
+ variable and use this to populate emerged objects. Here is an example:
+
+ # Defaults to /tmp/sysroot_bisect
+ export BISECT_DIR="/path/to/where/you/want/to/store/builds/"
+
+ export BISECT_STAGE="POPULATE_GOOD"
+ ./switch_to_good_compiler.sh
+ emerge-${board} -C ${package_to_bisect}
+ emerge-${board} ${package_to_bisect}
+
+ export BISECT_STAGE="POPULATE_BAD"
+ ./switch_to_bad_compiler.sh
+ emerge-${board} -C {package_to_bisect}
+ emerge-${board} ${package_to_bisect}
+
+ b) Cleanup:
+ The user must clean up all built images and the populated object files.
+
+ c) Default Arguments:
+ --get_initial_items='sysroot_wrapper/get_initial_items.sh'
+ --switch_to_good='sysroot_wrapper/switch_to_good.sh'
+ --switch_to_bad='sysroot_wrapper/switch_to_bad.sh'
+ --test_setup_script='sysroot_wrapper/test_setup.sh'
+ --test_script='sysroot_wrapper/interactive_test.sh'
+ --noincremental
+ --prune
+ --file_args
+
+ d) Additional Documentation:
+ See ./sysroot_wrapper/README for full documentation of ChromeOS object file
+ bisecting.
+
+ e) Examples:
+ i) Basic interactive test object bisection, on daisy board for
+ cryptohome package:
+ ./bisect.py object daisy 172.17.211.184 cryptohome
+
+ ii) Basic boot test package bisection, on daisy board for cryptohome
+ package:
+ ./bisect.py object daisy 172.17.211.184 cryptohome \
+ --test_script=sysroot_wrapper/boot_test.sh
+
+3) Android object:
+ NOTE: Because this isn't a ChromeOS bisection tool, the concept of a
+ chroot doesn't exist. Just run this tool from a normal shell.
+
+ This method will bisect across all objects in the Android source tree and
+ find the offending objects (according to your test script). This method takes
+ the following arguments:
+
+ android_src: The location of your android source tree
+ num_jobs: (Optional) The number of jobs to pass to make. This is dependent
+ on how many cores your machine has. A good number is probably
+ somewhere around 5 to 10.
+ device_id: (Optional) The serial code for the device you are testing on.
+ This is used to determine which device should be used in case
+ multiple devices are plugged into your computer. You can get
+ serial code for your device by running "adb devices".
+ dir: (Optional) the directory for your good/bad build trees. Defaults to
+ $BISECT_DIR or ~/ANDROID_BISECT/. This value will set $BISECT_DIR
+ for all bisecting scripts.
+
+ By default the Android object method will do a simple interactive test that
+ pings the machine and prompts the user if the machine is good.
+
+ a) Setup:
+ The Android object method requires that you populate your good and bad set
+ of objects. The Android compiler wrapper will automatically detect the
+ BISECT_STAGE variable and use this to populate emerged objects. Here is an
+ example:
+
+ # Defaults to ~/ANDROID_BISECT/
+ export BISECT_DIR="/path/to/where/you/want/to/store/builds/"
+
+ export BISECT_STAGE="POPULATE_GOOD"
+ # Install the "good" compiler
+ ./switch_to_good_compiler.sh
+ make clean
+ make -j <your_preferred_number_of_jobs>
+
+ export BISECT_STAGE="POPULATE_BAD"
+ # Install the "bad" compiler
+ ./switch_to_bad_compiler.sh
+ make clean
+ make -j <your_preferred_number_of_jobs>
+
+ b) Cleanup:
+ The user must clean up all built images and the populated object files.
+
+ c) Default Arguments:
+ --get_initial_items='android/get_initial_items.sh'
+ --switch_to_good='android/switch_to_good.sh'
+ --switch_to_bad='android/switch_to_bad.sh'
+ --test_setup_script='android/test_setup.sh'
+ --test_script='android/interactive_test.sh'
+ --incremental
+ --prune
+ --file_args
+
+ d) Additional Documentation:
+ See ./android/README.android for full documentation of Android object file
+ bisecting.
+
+ e) Examples:
+ i) Basic interactive test android bisection, where the android source is
+ at ~/android_src:
+ ./bisect.py android ~/android_src
+
+ ii) Basic boot test android bisection, where the android source is at
+ ~/android_src, and 10 jobs will be used to build android:
+ ./bisect.py android ~/android_src --num_jobs=10 \
+ --test_script=sysroot_wrapper/boot_test.sh
+
+Resuming:
+ bisect.py and binary_search_state.py offer the ability to resume a bisection
+ in case it was interrupted by a SIGINT, power failure, etc. Every time the
+ tool completes a bisection iteration its state is saved to disk (usually to
+ the file "./bisect.py.state"). If passed the --resume option, the tool
+ it will automatically detect the state file and resume from the last
+ completed iteration.
+
+Overriding:
+ You can run ./bisect.py --help or ./binary_search_state.py --help for a full
+ list of arguments that can be overriden. Here are a couple of examples:
+
+ Example 1 (do boot test instead of interactive test):
+ ./bisect.py package daisy 172.17.211.182 --test_script=cros_pkg/boot_test.sh
+
+ Example 2 (do package bisector system test instead of interactive test, this
+ is used to test the bisecting tool itself -- see comments in
+ hash_test.sh for more details):
+ ./bisect.py package daisy 172.17.211.182 \
+ --test_script=common/hash_test.sh --test_setup_script=""
+
+ Example 3 (enable verbose mode, disable pruning, and disable verification):
+ ./bisect.py package daisy 172.17.211.182 \
+ --verbose --prune=False --verify=False
+