OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 # | 2 # |
3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 # | 6 # |
7 | 7 |
8 # A generic script used to attach to a running Chromium process and | 8 # A generic script used to attach to a running Chromium process and |
9 # debug it. Most users should not use this directly, but one of the | 9 # debug it. Most users should not use this directly, but one of the |
10 # wrapper scripts like adb_gdb_content_shell, or adb_gdb_drt | 10 # wrapper scripts like adb_gdb_content_shell, or adb_gdb_drt |
(...skipping 18 matching lines...) Expand all Loading... |
29 log "Killing background gdbserver process: $GDBSERVER_PID" | 29 log "Killing background gdbserver process: $GDBSERVER_PID" |
30 kill -9 $GDBSERVER_PID >/dev/null 2>&1 | 30 kill -9 $GDBSERVER_PID >/dev/null 2>&1 |
31 fi | 31 fi |
32 if [ "$TARGET_GDBSERVER" ]; then | 32 if [ "$TARGET_GDBSERVER" ]; then |
33 log "Removing target gdbserver binary: $TARGET_GDBSERVER." | 33 log "Removing target gdbserver binary: $TARGET_GDBSERVER." |
34 "$ADB" shell rm "$TARGET_GDBSERVER" >/dev/null 2>&1 | 34 "$ADB" shell rm "$TARGET_GDBSERVER" >/dev/null 2>&1 |
35 fi | 35 fi |
36 log "Cleaning up: $TMPDIR" | 36 log "Cleaning up: $TMPDIR" |
37 rm -rf "$TMPDIR" | 37 rm -rf "$TMPDIR" |
38 fi | 38 fi |
| 39 trap "" EXIT |
39 exit $1 | 40 exit $1 |
40 } | 41 } |
41 | 42 |
42 # Ensure clean exit on Ctrl-C. | 43 # Ensure clean exit on Ctrl-C or normal exit. |
43 trap "clean_exit 1" INT | 44 trap "clean_exit 1" INT HUP QUIT TERM |
| 45 trap "clean_exit \$?" EXIT |
44 | 46 |
45 panic () { | 47 panic () { |
46 echo "ERROR: $@" >&2 | 48 echo "ERROR: $@" >&2 |
47 clean_exit 1 | 49 exit 1 |
48 } | 50 } |
49 | 51 |
50 fail_panic () { | 52 fail_panic () { |
51 if [ $? != 0 ]; then panic "$@"; fi | 53 if [ $? != 0 ]; then panic "$@"; fi |
52 } | 54 } |
53 | 55 |
54 log () { | 56 log () { |
55 if [ "$VERBOSE" -gt 0 ]; then | 57 if [ "$VERBOSE" -gt 0 ]; then |
56 echo "$@" | 58 echo "$@" |
57 fi | 59 fi |
(...skipping 30 matching lines...) Expand all Loading... |
88 NDK_DIR= | 90 NDK_DIR= |
89 NO_PULL_LIBS= | 91 NO_PULL_LIBS= |
90 PACKAGE_NAME= | 92 PACKAGE_NAME= |
91 PID= | 93 PID= |
92 PROGRAM_NAME="activity" | 94 PROGRAM_NAME="activity" |
93 PULL_LIBS= | 95 PULL_LIBS= |
94 PULL_LIBS_DIR= | 96 PULL_LIBS_DIR= |
95 SANDBOXED= | 97 SANDBOXED= |
96 SANDBOXED_INDEX= | 98 SANDBOXED_INDEX= |
97 START= | 99 START= |
| 100 SU_PREFIX= |
98 SYMBOL_DIR= | 101 SYMBOL_DIR= |
99 TARGET_ARCH= | 102 TARGET_ARCH= |
100 TOOLCHAIN= | 103 TOOLCHAIN= |
101 VERBOSE=0 | 104 VERBOSE=0 |
102 | 105 |
103 for opt; do | 106 for opt; do |
104 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)') | 107 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)') |
105 case $opt in | 108 case $opt in |
106 --adb=*) | 109 --adb=*) |
107 ADB=$optarg | 110 ADB=$optarg |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 --sandboxed=*) | 151 --sandboxed=*) |
149 SANDBOXED=true | 152 SANDBOXED=true |
150 SANDBOXED_INDEX=$optarg | 153 SANDBOXED_INDEX=$optarg |
151 ;; | 154 ;; |
152 --script=*) | 155 --script=*) |
153 GDBINIT=$optarg | 156 GDBINIT=$optarg |
154 ;; | 157 ;; |
155 --start) | 158 --start) |
156 START=true | 159 START=true |
157 ;; | 160 ;; |
| 161 --su-prefix=*) |
| 162 SU_PREFIX=$optarg |
| 163 ;; |
158 --symbol-dir=*) | 164 --symbol-dir=*) |
159 SYMBOL_DIR=$optarg | 165 SYMBOL_DIR=$optarg |
160 ;; | 166 ;; |
161 --target-arch=*) | 167 --target-arch=*) |
162 TARGET_ARCH=$optarg | 168 TARGET_ARCH=$optarg |
163 ;; | 169 ;; |
164 --toolchain=*) | 170 --toolchain=*) |
165 TOOLCHAIN=$optarg | 171 TOOLCHAIN=$optarg |
166 ;; | 172 ;; |
167 --ui) | 173 --ui) |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 --ui Use gdbtui instead of gdb | 300 --ui Use gdbtui instead of gdb |
295 --activity=<name> Activity name for --start [$DEFAULT_ACTIVITY]. | 301 --activity=<name> Activity name for --start [$DEFAULT_ACTIVITY]. |
296 --annotate=<num> Enable gdb annotation. | 302 --annotate=<num> Enable gdb annotation. |
297 --script=<file> Specify extra GDB init script. | 303 --script=<file> Specify extra GDB init script. |
298 | 304 |
299 --gdbserver=<file> Specify targer gdbserver binary. | 305 --gdbserver=<file> Specify targer gdbserver binary. |
300 --gdb=<program> Specify host gdb client binary. | 306 --gdb=<program> Specify host gdb client binary. |
301 --target-arch=<name> Specify NDK target arch. | 307 --target-arch=<name> Specify NDK target arch. |
302 --adb=<program> Specify host ADB binary. | 308 --adb=<program> Specify host ADB binary. |
303 | 309 |
| 310 --su-prefix=<prefix> Prepend <prefix> to 'adb shell' commands that are |
| 311 run by this script. This can be useful to use |
| 312 the 'su' program on rooted production devices. |
| 313 |
304 --pull-libs Force system libraries extraction. | 314 --pull-libs Force system libraries extraction. |
305 --no-pull-libs Do not extract any system library. | 315 --no-pull-libs Do not extract any system library. |
306 --libs-dir=<path> Specify system libraries extraction directory. | 316 --libs-dir=<path> Specify system libraries extraction directory. |
307 | 317 |
308 --debug Use libraries under out/Debug. | 318 --debug Use libraries under out/Debug. |
309 --release Use libraries under out/Release. | 319 --release Use libraries under out/Release. |
310 | 320 |
311 EOF | 321 EOF |
312 exit 0 | 322 exit 0 |
313 fi | 323 fi |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 fi | 816 fi |
807 log "Found process PID: $PID" | 817 log "Found process PID: $PID" |
808 elif [ "$SANDBOXED" ]; then | 818 elif [ "$SANDBOXED" ]; then |
809 echo "WARNING: --sandboxed option ignored due to use of --pid." | 819 echo "WARNING: --sandboxed option ignored due to use of --pid." |
810 fi | 820 fi |
811 | 821 |
812 # Determine if 'adb shell' runs as root or not. | 822 # Determine if 'adb shell' runs as root or not. |
813 # If so, we can launch gdbserver directly, otherwise, we have to | 823 # If so, we can launch gdbserver directly, otherwise, we have to |
814 # use run-as $PACKAGE_NAME ..., which requires the package to be debuggable. | 824 # use run-as $PACKAGE_NAME ..., which requires the package to be debuggable. |
815 # | 825 # |
816 SHELL_UID=$(adb shell cat /proc/self/status | \ | 826 if [ "$SU_PREFIX" ]; then |
817 awk '$1 == "Uid:" { print $2; }') | 827 # Need to check that this works properly. |
818 log "Shell UID: $SHELL_UID" | 828 SU_PREFIX_TEST_LOG=$TMPDIR/su-prefix.log |
819 COMMAND_PREFIX= | 829 adb_shell $SU_PREFIX echo "foo" > $SU_PREFIX_TEST_LOG 2>&1 |
820 if [ "$SHELL_UID" != 0 -o -n "$NO_ROOT" ]; then | 830 if [ $? != 0 -o "$(cat $SU_PREFIX_TEST_LOG)" != "foo" ]; then |
821 log "Using run-as $PACKAGE_NAME to run without root." | 831 echo "ERROR: Cannot use '$SU_PREFIX' as a valid su prefix:" |
822 COMMAND_PREFIX="run-as $PACKAGE_NAME" | 832 echo "$ adb shell $SU_PREFIX echo foo" |
| 833 cat $SU_PREFIX_TEST_LOG |
| 834 exit 1 |
| 835 fi |
| 836 COMMAND_PREFIX=$SU_PREFIX |
| 837 else |
| 838 SHELL_UID=$(adb shell cat /proc/self/status | \ |
| 839 awk '$1 == "Uid:" { print $2; }') |
| 840 log "Shell UID: $SHELL_UID" |
| 841 if [ "$SHELL_UID" != 0 -o -n "$NO_ROOT" ]; then |
| 842 COMMAND_PREFIX="run-as $PACKAGE_NAME" |
| 843 else |
| 844 COMMAND_PREFIX= |
| 845 fi |
823 fi | 846 fi |
| 847 log "Command prefix: '$COMMAND_PREFIX'" |
824 | 848 |
825 # Pull device's system libraries that are mapped by our process. | 849 # Pull device's system libraries that are mapped by our process. |
826 # Pulling all system libraries is too long, so determine which ones | 850 # Pulling all system libraries is too long, so determine which ones |
827 # we need by looking at /proc/$PID/maps instead | 851 # we need by looking at /proc/$PID/maps instead |
828 if [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then | 852 if [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then |
829 echo "Extracting system libraries into: $PULL_LIBS_DIR" | 853 echo "Extracting system libraries into: $PULL_LIBS_DIR" |
830 SYSTEM_LIBS=$(adb_shell $COMMAND_PREFIX cat /proc/$PID/maps | \ | 854 rm -f $PULL_LIBS_DIR/build.prop |
831 awk '$6 ~ /\/system\/.*\.so$/ { print $6; }' | sort -u) | 855 MAPPINGS=$(adb_shell $COMMAND_PREFIX cat /proc/$PID/maps) |
| 856 if [ $? != 0 ]; then |
| 857 echo "ERROR: Could not list process's memory mappings." |
| 858 if [ "$SU_PREFIX" ]; then |
| 859 panic "Are you sure your --su-prefix is correct?" |
| 860 else |
| 861 panic "Use --su-prefix if the application is not debuggable." |
| 862 fi |
| 863 fi |
| 864 SYSTEM_LIBS=$(echo "$MAPPINGS" | \ |
| 865 awk '$6 ~ /\/system\/.*\.so$/ { print $6; }' | sort -u) |
832 for SYSLIB in /system/bin/linker $SYSTEM_LIBS; do | 866 for SYSLIB in /system/bin/linker $SYSTEM_LIBS; do |
833 echo "Pulling from device: $SYSLIB" | 867 echo "Pulling from device: $SYSLIB" |
834 DST_FILE=$PULL_LIBS_DIR$SYSLIB | 868 DST_FILE=$PULL_LIBS_DIR$SYSLIB |
835 DST_DIR=$(dirname "$DST_FILE") | 869 DST_DIR=$(dirname "$DST_FILE") |
836 mkdir -p "$DST_DIR" && adb pull $SYSLIB "$DST_FILE" 2>/dev/null | 870 mkdir -p "$DST_DIR" && adb pull $SYSLIB "$DST_FILE" 2>/dev/null |
837 fail_panic "Could not pull $SYSLIB from device !?" | 871 fail_panic "Could not pull $SYSLIB from device !?" |
838 done | 872 done |
839 echo "Pulling device build.prop" | 873 echo "Pulling device build.prop" |
840 adb pull /system/build.prop $PULL_LIBS_DIR/build.prop | 874 adb pull /system/build.prop $PULL_LIBS_DIR/build.prop |
841 fail_panic "Could not pull device build.prop !?" | 875 fail_panic "Could not pull device build.prop !?" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 | 954 |
921 if [ "$VERBOSE" -gt 0 ]; then | 955 if [ "$VERBOSE" -gt 0 ]; then |
922 echo "### START $COMMANDS" | 956 echo "### START $COMMANDS" |
923 cat $COMMANDS | 957 cat $COMMANDS |
924 echo "### END $COMMANDS" | 958 echo "### END $COMMANDS" |
925 fi | 959 fi |
926 | 960 |
927 log "Launching gdb client: $GDB $GDBARGS -x $COMMANDS" | 961 log "Launching gdb client: $GDB $GDBARGS -x $COMMANDS" |
928 $GDB $GDBARGS -x $COMMANDS && | 962 $GDB $GDBARGS -x $COMMANDS && |
929 rm -f "$GDBSERVER_PIDFILE" | 963 rm -f "$GDBSERVER_PIDFILE" |
930 | |
931 clean_exit $? | |
OLD | NEW |