xref: /aosp_15_r20/external/cronet/build/android/adb_gdb (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker#!/bin/bash
2*6777b538SAndroid Build Coastguard Worker#
3*6777b538SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors
4*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
6*6777b538SAndroid Build Coastguard Worker#
7*6777b538SAndroid Build Coastguard Worker
8*6777b538SAndroid Build Coastguard Worker# A generic script used to attach to a running Chromium process and
9*6777b538SAndroid Build Coastguard Worker# debug it. Most users should not use this directly, but one of the
10*6777b538SAndroid Build Coastguard Worker# wrapper scripts like adb_gdb_content_shell
11*6777b538SAndroid Build Coastguard Worker#
12*6777b538SAndroid Build Coastguard Worker# Use --help to print full usage instructions.
13*6777b538SAndroid Build Coastguard Worker#
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard WorkerPROGNAME=$(basename "$0")
16*6777b538SAndroid Build Coastguard WorkerPROGDIR=$(dirname "$0")
17*6777b538SAndroid Build Coastguard Worker
18*6777b538SAndroid Build Coastguard Worker# Force locale to C to allow recognizing output from subprocesses.
19*6777b538SAndroid Build Coastguard WorkerLC_ALL=C
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker# Location of Chromium-top-level sources.
22*6777b538SAndroid Build Coastguard WorkerCHROMIUM_SRC=$(cd "$PROGDIR"/../.. >/dev/null && pwd 2>/dev/null)
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard WorkerTMPDIR=
25*6777b538SAndroid Build Coastguard WorkerGDBSERVER_PIDFILE=
26*6777b538SAndroid Build Coastguard WorkerTARGET_GDBSERVER=
27*6777b538SAndroid Build Coastguard WorkerCOMMAND_PREFIX=
28*6777b538SAndroid Build Coastguard WorkerCOMMAND_SUFFIX=
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Workerclean_exit () {
31*6777b538SAndroid Build Coastguard Worker  if [ "$TMPDIR" ]; then
32*6777b538SAndroid Build Coastguard Worker    GDBSERVER_PID=$(cat $GDBSERVER_PIDFILE 2>/dev/null)
33*6777b538SAndroid Build Coastguard Worker    if [ "$GDBSERVER_PID" ]; then
34*6777b538SAndroid Build Coastguard Worker      log "Killing background gdbserver process: $GDBSERVER_PID"
35*6777b538SAndroid Build Coastguard Worker      kill -9 $GDBSERVER_PID >/dev/null 2>&1
36*6777b538SAndroid Build Coastguard Worker      rm -f "$GDBSERVER_PIDFILE"
37*6777b538SAndroid Build Coastguard Worker    fi
38*6777b538SAndroid Build Coastguard Worker    if [ "$TARGET_GDBSERVER" ]; then
39*6777b538SAndroid Build Coastguard Worker      log "Removing target gdbserver binary: $TARGET_GDBSERVER."
40*6777b538SAndroid Build Coastguard Worker      "$ADB" shell "$COMMAND_PREFIX" rm "$TARGET_GDBSERVER" \
41*6777b538SAndroid Build Coastguard Worker          "$TARGET_DOMAIN_SOCKET" "$COMMAND_SUFFIX" >/dev/null 2>&1
42*6777b538SAndroid Build Coastguard Worker    fi
43*6777b538SAndroid Build Coastguard Worker    log "Cleaning up: $TMPDIR"
44*6777b538SAndroid Build Coastguard Worker    rm -rf "$TMPDIR"
45*6777b538SAndroid Build Coastguard Worker  fi
46*6777b538SAndroid Build Coastguard Worker  trap "" EXIT
47*6777b538SAndroid Build Coastguard Worker  exit $1
48*6777b538SAndroid Build Coastguard Worker}
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker# Ensure clean exit on Ctrl-C or normal exit.
51*6777b538SAndroid Build Coastguard Workertrap "clean_exit 1" INT HUP QUIT TERM
52*6777b538SAndroid Build Coastguard Workertrap "clean_exit \$?" EXIT
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Workerpanic () {
55*6777b538SAndroid Build Coastguard Worker  echo "ERROR: $@" >&2
56*6777b538SAndroid Build Coastguard Worker  exit 1
57*6777b538SAndroid Build Coastguard Worker}
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Workerfail_panic () {
60*6777b538SAndroid Build Coastguard Worker  if [ $? != 0 ]; then panic "$@"; fi
61*6777b538SAndroid Build Coastguard Worker}
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Workerlog () {
64*6777b538SAndroid Build Coastguard Worker  if [ "$VERBOSE" -gt 0 ]; then
65*6777b538SAndroid Build Coastguard Worker    echo "$@"
66*6777b538SAndroid Build Coastguard Worker  fi
67*6777b538SAndroid Build Coastguard Worker}
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard WorkerDEFAULT_PULL_LIBS_DIR="/tmp/adb-gdb-support-$USER"
70*6777b538SAndroid Build Coastguard WorkerIDE_DIR="$DEFAULT_PULL_LIBS_DIR"
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker# NOTE: Allow wrapper scripts to set various default through ADB_GDB_XXX
73*6777b538SAndroid Build Coastguard Worker# environment variables. This is only for cosmetic reasons, i.e. to
74*6777b538SAndroid Build Coastguard Worker# display proper
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker# Allow wrapper scripts to set the program name through ADB_GDB_PROGNAME
77*6777b538SAndroid Build Coastguard WorkerPROGNAME=${ADB_GDB_PROGNAME:-$(basename "$0")}
78*6777b538SAndroid Build Coastguard Worker
79*6777b538SAndroid Build Coastguard WorkerADB=
80*6777b538SAndroid Build Coastguard WorkerANNOTATE=
81*6777b538SAndroid Build Coastguard WorkerCGDB=
82*6777b538SAndroid Build Coastguard WorkerGDBINIT=
83*6777b538SAndroid Build Coastguard WorkerGDBSERVER=
84*6777b538SAndroid Build Coastguard WorkerHELP=
85*6777b538SAndroid Build Coastguard WorkerIDE=
86*6777b538SAndroid Build Coastguard WorkerNDK_DIR=
87*6777b538SAndroid Build Coastguard WorkerNO_PULL_LIBS=
88*6777b538SAndroid Build Coastguard WorkerPACKAGE_NAME=
89*6777b538SAndroid Build Coastguard WorkerPID=
90*6777b538SAndroid Build Coastguard WorkerPORT=
91*6777b538SAndroid Build Coastguard WorkerPROGRAM_NAME="activity"
92*6777b538SAndroid Build Coastguard WorkerPULL_LIBS=
93*6777b538SAndroid Build Coastguard WorkerPULL_LIBS_DIR=
94*6777b538SAndroid Build Coastguard WorkerATTACH_DELAY=1
95*6777b538SAndroid Build Coastguard WorkerSU_PREFIX=
96*6777b538SAndroid Build Coastguard WorkerSYMBOL_DIR=
97*6777b538SAndroid Build Coastguard WorkerTARGET_ARCH=
98*6777b538SAndroid Build Coastguard WorkerTOOLCHAIN=
99*6777b538SAndroid Build Coastguard WorkerVERBOSE=0
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Workerfor opt; do
102*6777b538SAndroid Build Coastguard Worker  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
103*6777b538SAndroid Build Coastguard Worker  case $opt in
104*6777b538SAndroid Build Coastguard Worker    --adb=*)
105*6777b538SAndroid Build Coastguard Worker      ADB=$optarg
106*6777b538SAndroid Build Coastguard Worker      ;;
107*6777b538SAndroid Build Coastguard Worker    --device=*)
108*6777b538SAndroid Build Coastguard Worker      export ANDROID_SERIAL=$optarg
109*6777b538SAndroid Build Coastguard Worker      ;;
110*6777b538SAndroid Build Coastguard Worker    --annotate=3)
111*6777b538SAndroid Build Coastguard Worker      ANNOTATE=$optarg
112*6777b538SAndroid Build Coastguard Worker      ;;
113*6777b538SAndroid Build Coastguard Worker    --gdbserver=*)
114*6777b538SAndroid Build Coastguard Worker      GDBSERVER=$optarg
115*6777b538SAndroid Build Coastguard Worker      ;;
116*6777b538SAndroid Build Coastguard Worker    --gdb=*)
117*6777b538SAndroid Build Coastguard Worker      GDB=$optarg
118*6777b538SAndroid Build Coastguard Worker      ;;
119*6777b538SAndroid Build Coastguard Worker    --help|-h|-?)
120*6777b538SAndroid Build Coastguard Worker      HELP=true
121*6777b538SAndroid Build Coastguard Worker      ;;
122*6777b538SAndroid Build Coastguard Worker    --ide)
123*6777b538SAndroid Build Coastguard Worker      IDE=true
124*6777b538SAndroid Build Coastguard Worker      ;;
125*6777b538SAndroid Build Coastguard Worker    --ndk-dir=*)
126*6777b538SAndroid Build Coastguard Worker      NDK_DIR=$optarg
127*6777b538SAndroid Build Coastguard Worker      ;;
128*6777b538SAndroid Build Coastguard Worker    --no-pull-libs)
129*6777b538SAndroid Build Coastguard Worker      NO_PULL_LIBS=true
130*6777b538SAndroid Build Coastguard Worker      ;;
131*6777b538SAndroid Build Coastguard Worker    --package-name=*)
132*6777b538SAndroid Build Coastguard Worker      PACKAGE_NAME=$optarg
133*6777b538SAndroid Build Coastguard Worker      ;;
134*6777b538SAndroid Build Coastguard Worker    --pid=*)
135*6777b538SAndroid Build Coastguard Worker      PID=$optarg
136*6777b538SAndroid Build Coastguard Worker      ;;
137*6777b538SAndroid Build Coastguard Worker    --port=*)
138*6777b538SAndroid Build Coastguard Worker      PORT=$optarg
139*6777b538SAndroid Build Coastguard Worker      ;;
140*6777b538SAndroid Build Coastguard Worker    --program-name=*)
141*6777b538SAndroid Build Coastguard Worker      PROGRAM_NAME=$optarg
142*6777b538SAndroid Build Coastguard Worker      ;;
143*6777b538SAndroid Build Coastguard Worker    --pull-libs)
144*6777b538SAndroid Build Coastguard Worker      PULL_LIBS=true
145*6777b538SAndroid Build Coastguard Worker      ;;
146*6777b538SAndroid Build Coastguard Worker    --pull-libs-dir=*)
147*6777b538SAndroid Build Coastguard Worker      PULL_LIBS_DIR=$optarg
148*6777b538SAndroid Build Coastguard Worker      ;;
149*6777b538SAndroid Build Coastguard Worker    --script=*)
150*6777b538SAndroid Build Coastguard Worker      GDBINIT=$optarg
151*6777b538SAndroid Build Coastguard Worker      ;;
152*6777b538SAndroid Build Coastguard Worker    --attach-delay=*)
153*6777b538SAndroid Build Coastguard Worker      ATTACH_DELAY=$optarg
154*6777b538SAndroid Build Coastguard Worker      ;;
155*6777b538SAndroid Build Coastguard Worker    --su-prefix=*)
156*6777b538SAndroid Build Coastguard Worker      SU_PREFIX=$optarg
157*6777b538SAndroid Build Coastguard Worker      ;;
158*6777b538SAndroid Build Coastguard Worker    --symbol-dir=*)
159*6777b538SAndroid Build Coastguard Worker      SYMBOL_DIR=$optarg
160*6777b538SAndroid Build Coastguard Worker      ;;
161*6777b538SAndroid Build Coastguard Worker    --output-directory=*)
162*6777b538SAndroid Build Coastguard Worker      CHROMIUM_OUTPUT_DIR=$optarg
163*6777b538SAndroid Build Coastguard Worker      ;;
164*6777b538SAndroid Build Coastguard Worker    --target-arch=*)
165*6777b538SAndroid Build Coastguard Worker      TARGET_ARCH=$optarg
166*6777b538SAndroid Build Coastguard Worker      ;;
167*6777b538SAndroid Build Coastguard Worker    --toolchain=*)
168*6777b538SAndroid Build Coastguard Worker      TOOLCHAIN=$optarg
169*6777b538SAndroid Build Coastguard Worker      ;;
170*6777b538SAndroid Build Coastguard Worker    --cgdb)
171*6777b538SAndroid Build Coastguard Worker      CGDB=cgdb
172*6777b538SAndroid Build Coastguard Worker      ;;
173*6777b538SAndroid Build Coastguard Worker    --cgdb=*)
174*6777b538SAndroid Build Coastguard Worker      CGDB=$optarg
175*6777b538SAndroid Build Coastguard Worker      ;;
176*6777b538SAndroid Build Coastguard Worker    --verbose)
177*6777b538SAndroid Build Coastguard Worker      VERBOSE=$(( $VERBOSE + 1 ))
178*6777b538SAndroid Build Coastguard Worker      ;;
179*6777b538SAndroid Build Coastguard Worker    -*)
180*6777b538SAndroid Build Coastguard Worker      panic "Unknown option $opt, see --help." >&2
181*6777b538SAndroid Build Coastguard Worker      ;;
182*6777b538SAndroid Build Coastguard Worker    *)
183*6777b538SAndroid Build Coastguard Worker      if [ "$PACKAGE_NAME" ]; then
184*6777b538SAndroid Build Coastguard Worker        panic "You can only provide a single package name as argument!\
185*6777b538SAndroid Build Coastguard Worker See --help."
186*6777b538SAndroid Build Coastguard Worker      fi
187*6777b538SAndroid Build Coastguard Worker      PACKAGE_NAME=$opt
188*6777b538SAndroid Build Coastguard Worker      ;;
189*6777b538SAndroid Build Coastguard Worker  esac
190*6777b538SAndroid Build Coastguard Workerdone
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Workerif [ "$HELP" ]; then
193*6777b538SAndroid Build Coastguard Worker  if [ "$ADB_GDB_PROGNAME" ]; then
194*6777b538SAndroid Build Coastguard Worker    # Assume wrapper scripts all provide a default package name.
195*6777b538SAndroid Build Coastguard Worker    cat <<EOF
196*6777b538SAndroid Build Coastguard WorkerUsage: $PROGNAME [options]
197*6777b538SAndroid Build Coastguard Worker
198*6777b538SAndroid Build Coastguard WorkerAttach gdb to a running Android $PROGRAM_NAME process.
199*6777b538SAndroid Build Coastguard WorkerEOF
200*6777b538SAndroid Build Coastguard Worker  else
201*6777b538SAndroid Build Coastguard Worker    # Assume this is a direct call to adb_gdb
202*6777b538SAndroid Build Coastguard Worker  cat <<EOF
203*6777b538SAndroid Build Coastguard WorkerUsage: $PROGNAME [options] [<package-name>]
204*6777b538SAndroid Build Coastguard Worker
205*6777b538SAndroid Build Coastguard WorkerAttach gdb to a running Android $PROGRAM_NAME process.
206*6777b538SAndroid Build Coastguard Worker
207*6777b538SAndroid Build Coastguard WorkerIf provided, <package-name> must be the name of the Android application's
208*6777b538SAndroid Build Coastguard Workerpackage name to be debugged. You can also use --package-name=<name> to
209*6777b538SAndroid Build Coastguard Workerspecify it.
210*6777b538SAndroid Build Coastguard WorkerEOF
211*6777b538SAndroid Build Coastguard Worker  fi
212*6777b538SAndroid Build Coastguard Worker
213*6777b538SAndroid Build Coastguard Worker  cat <<EOF
214*6777b538SAndroid Build Coastguard Worker
215*6777b538SAndroid Build Coastguard WorkerThis script is used to debug a running $PROGRAM_NAME process.
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard WorkerThis script needs several things to work properly. It will try to pick
218*6777b538SAndroid Build Coastguard Workerthem up automatically for you though:
219*6777b538SAndroid Build Coastguard Worker
220*6777b538SAndroid Build Coastguard Worker   - target gdbserver binary
221*6777b538SAndroid Build Coastguard Worker   - host gdb client (e.g. arm-linux-androideabi-gdb)
222*6777b538SAndroid Build Coastguard Worker   - directory with symbolic version of $PROGRAM_NAME's shared libraries.
223*6777b538SAndroid Build Coastguard Worker
224*6777b538SAndroid Build Coastguard WorkerYou can also use --ndk-dir=<path> to specify an alternative NDK installation
225*6777b538SAndroid Build Coastguard Workerdirectory.
226*6777b538SAndroid Build Coastguard Worker
227*6777b538SAndroid Build Coastguard WorkerThe script tries to find the most recent version of the debug version of
228*6777b538SAndroid Build Coastguard Workershared libraries under one of the following directories:
229*6777b538SAndroid Build Coastguard Worker
230*6777b538SAndroid Build Coastguard Worker  \$CHROMIUM_SRC/<out>/lib/                (used by GYP builds)
231*6777b538SAndroid Build Coastguard Worker  \$CHROMIUM_SRC/<out>/lib.unstripped/     (used by GN builds)
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard WorkerWhere <out> is determined by CHROMIUM_OUTPUT_DIR, or --output-directory.
234*6777b538SAndroid Build Coastguard Worker
235*6777b538SAndroid Build Coastguard WorkerYou can set the path manually via --symbol-dir.
236*6777b538SAndroid Build Coastguard Worker
237*6777b538SAndroid Build Coastguard WorkerThe script tries to extract the target architecture from your target device,
238*6777b538SAndroid Build Coastguard Workerbut if this fails, will default to 'arm'. Use --target-arch=<name> to force
239*6777b538SAndroid Build Coastguard Workerits value.
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard WorkerOtherwise, the script will complain, but you can use the --gdbserver,
242*6777b538SAndroid Build Coastguard Worker--gdb and --symbol-lib options to specify everything manually.
243*6777b538SAndroid Build Coastguard Worker
244*6777b538SAndroid Build Coastguard WorkerAn alternative to --gdb=<file> is to use --toollchain=<path> to specify
245*6777b538SAndroid Build Coastguard Workerthe path to the host target-specific cross-toolchain.
246*6777b538SAndroid Build Coastguard Worker
247*6777b538SAndroid Build Coastguard WorkerYou will also need the 'adb' tool in your path. Otherwise, use the --adb
248*6777b538SAndroid Build Coastguard Workeroption. The script will complain if there is more than one device connected
249*6777b538SAndroid Build Coastguard Workerand a device is not specified with either --device or ANDROID_SERIAL).
250*6777b538SAndroid Build Coastguard Worker
251*6777b538SAndroid Build Coastguard WorkerThe first time you use it on a device, the script will pull many system
252*6777b538SAndroid Build Coastguard Workerlibraries required by the process into a temporary directory. This
253*6777b538SAndroid Build Coastguard Workeris done to strongly improve the debugging experience, like allowing
254*6777b538SAndroid Build Coastguard Workerreadable thread stacks and more. The libraries are copied to the following
255*6777b538SAndroid Build Coastguard Workerdirectory by default:
256*6777b538SAndroid Build Coastguard Worker
257*6777b538SAndroid Build Coastguard Worker  $DEFAULT_PULL_LIBS_DIR/
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard WorkerBut you can use the --pull-libs-dir=<path> option to specify an
260*6777b538SAndroid Build Coastguard Workeralternative. The script can detect when you change the connected device,
261*6777b538SAndroid Build Coastguard Workerand will re-pull the libraries only in this case. You can however force it
262*6777b538SAndroid Build Coastguard Workerwith the --pull-libs option.
263*6777b538SAndroid Build Coastguard Worker
264*6777b538SAndroid Build Coastguard WorkerAny local .gdbinit script will be ignored, but it is possible to pass a
265*6777b538SAndroid Build Coastguard Workergdb command script with the --script=<file> option. Note that its commands
266*6777b538SAndroid Build Coastguard Workerwill be passed to gdb after the remote connection and library symbol
267*6777b538SAndroid Build Coastguard Workerloading have completed.
268*6777b538SAndroid Build Coastguard Worker
269*6777b538SAndroid Build Coastguard WorkerValid options:
270*6777b538SAndroid Build Coastguard Worker  --help|-h|-?          Print this message.
271*6777b538SAndroid Build Coastguard Worker  --verbose             Increase verbosity.
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker  --cgdb[=<file>]       Use cgdb (an interface for gdb that shows the code).
274*6777b538SAndroid Build Coastguard Worker  --symbol-dir=<path>   Specify directory with symbol shared libraries.
275*6777b538SAndroid Build Coastguard Worker  --output-directory=<path> Specify the output directory (e.g. "out/Debug").
276*6777b538SAndroid Build Coastguard Worker  --package-name=<name> Specify package name (alternative to 1st argument).
277*6777b538SAndroid Build Coastguard Worker  --program-name=<name> Specify program name (cosmetic only).
278*6777b538SAndroid Build Coastguard Worker  --pid=<pid>           Specify application process pid.
279*6777b538SAndroid Build Coastguard Worker  --attach-delay=<num>  Seconds to wait for gdbserver to attach to the
280*6777b538SAndroid Build Coastguard Worker                        remote process before starting gdb. Default 1.
281*6777b538SAndroid Build Coastguard Worker                        <num> may be a float if your sleep(1) supports it.
282*6777b538SAndroid Build Coastguard Worker  --annotate=<num>      Enable gdb annotation.
283*6777b538SAndroid Build Coastguard Worker  --script=<file>       Specify extra GDB init script.
284*6777b538SAndroid Build Coastguard Worker
285*6777b538SAndroid Build Coastguard Worker  --gdbserver=<file>    Specify target gdbserver binary.
286*6777b538SAndroid Build Coastguard Worker  --gdb=<file>          Specify host gdb client binary.
287*6777b538SAndroid Build Coastguard Worker  --target-arch=<name>  Specify NDK target arch.
288*6777b538SAndroid Build Coastguard Worker  --adb=<file>          Specify host ADB binary.
289*6777b538SAndroid Build Coastguard Worker  --device=<file>       ADB device serial to use (-s flag).
290*6777b538SAndroid Build Coastguard Worker  --port=<port>         Specify the tcp port to use.
291*6777b538SAndroid Build Coastguard Worker  --ide                 Forward gdb port, but do not enter gdb console.
292*6777b538SAndroid Build Coastguard Worker
293*6777b538SAndroid Build Coastguard Worker  --su-prefix=<prefix>  Prepend <prefix> to 'adb shell' commands that are
294*6777b538SAndroid Build Coastguard Worker                        run by this script. This can be useful to use
295*6777b538SAndroid Build Coastguard Worker                        the 'su' program on rooted production devices.
296*6777b538SAndroid Build Coastguard Worker                        e.g. --su-prefix="su -c"
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker  --pull-libs           Force system libraries extraction.
299*6777b538SAndroid Build Coastguard Worker  --no-pull-libs        Do not extract any system library.
300*6777b538SAndroid Build Coastguard Worker  --libs-dir=<path>     Specify system libraries extraction directory.
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard WorkerEOF
303*6777b538SAndroid Build Coastguard Worker  exit 0
304*6777b538SAndroid Build Coastguard Workerfi
305*6777b538SAndroid Build Coastguard Worker
306*6777b538SAndroid Build Coastguard Workerif [ -z "$PACKAGE_NAME" ]; then
307*6777b538SAndroid Build Coastguard Worker  panic "Please specify a package name on the command line. See --help."
308*6777b538SAndroid Build Coastguard Workerfi
309*6777b538SAndroid Build Coastguard Worker
310*6777b538SAndroid Build Coastguard Workerif [[ -z "$SYMBOL_DIR" && -z "$CHROMIUM_OUTPUT_DIR" ]]; then
311*6777b538SAndroid Build Coastguard Worker  if [[ -e "build.ninja" ]]; then
312*6777b538SAndroid Build Coastguard Worker    CHROMIUM_OUTPUT_DIR=$PWD
313*6777b538SAndroid Build Coastguard Worker  else
314*6777b538SAndroid Build Coastguard Worker    panic "Please specify an output directory by using one of:
315*6777b538SAndroid Build Coastguard Worker       --output-directory=out/Debug
316*6777b538SAndroid Build Coastguard Worker       CHROMIUM_OUTPUT_DIR=out/Debug
317*6777b538SAndroid Build Coastguard Worker       Setting working directory to an output directory.
318*6777b538SAndroid Build Coastguard Worker       See --help."
319*6777b538SAndroid Build Coastguard Worker   fi
320*6777b538SAndroid Build Coastguard Workerfi
321*6777b538SAndroid Build Coastguard Worker
322*6777b538SAndroid Build Coastguard Workerif ls *.so >/dev/null 2>&1; then
323*6777b538SAndroid Build Coastguard Worker  panic ".so files found in your working directory. These will conflict with" \
324*6777b538SAndroid Build Coastguard Worker      "library lookup logic. Change your working directory and try again."
325*6777b538SAndroid Build Coastguard Workerfi
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker# Detect the build type and symbol directory. This is done by finding
328*6777b538SAndroid Build Coastguard Worker# the most recent sub-directory containing debug shared libraries under
329*6777b538SAndroid Build Coastguard Worker# $CHROMIUM_OUTPUT_DIR.
330*6777b538SAndroid Build Coastguard Worker#
331*6777b538SAndroid Build Coastguard Worker# Out: nothing, but this sets SYMBOL_DIR
332*6777b538SAndroid Build Coastguard Worker#
333*6777b538SAndroid Build Coastguard Workerdetect_symbol_dir () {
334*6777b538SAndroid Build Coastguard Worker  # GYP places unstripped libraries under out/lib
335*6777b538SAndroid Build Coastguard Worker  # GN places them under out/lib.unstripped
336*6777b538SAndroid Build Coastguard Worker  local PARENT_DIR="$CHROMIUM_OUTPUT_DIR"
337*6777b538SAndroid Build Coastguard Worker  if [[ ! -e "$PARENT_DIR" ]]; then
338*6777b538SAndroid Build Coastguard Worker    PARENT_DIR="$CHROMIUM_SRC/$PARENT_DIR"
339*6777b538SAndroid Build Coastguard Worker  fi
340*6777b538SAndroid Build Coastguard Worker  SYMBOL_DIR="$PARENT_DIR/lib.unstripped"
341*6777b538SAndroid Build Coastguard Worker  if [[ -z "$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null)" ]]; then
342*6777b538SAndroid Build Coastguard Worker    SYMBOL_DIR="$PARENT_DIR/lib"
343*6777b538SAndroid Build Coastguard Worker    if [[ -z "$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null)" ]]; then
344*6777b538SAndroid Build Coastguard Worker      panic "Could not find any symbols under \
345*6777b538SAndroid Build Coastguard Worker$PARENT_DIR/lib{.unstripped}. Please build the program first!"
346*6777b538SAndroid Build Coastguard Worker    fi
347*6777b538SAndroid Build Coastguard Worker  fi
348*6777b538SAndroid Build Coastguard Worker  log "Auto-config: --symbol-dir=$SYMBOL_DIR"
349*6777b538SAndroid Build Coastguard Worker}
350*6777b538SAndroid Build Coastguard Worker
351*6777b538SAndroid Build Coastguard Workerif [ -z "$SYMBOL_DIR" ]; then
352*6777b538SAndroid Build Coastguard Worker  detect_symbol_dir
353*6777b538SAndroid Build Coastguard Workerelif [[ -z "$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null)" ]]; then
354*6777b538SAndroid Build Coastguard Worker  panic "Could not find any symbols under $SYMBOL_DIR"
355*6777b538SAndroid Build Coastguard Workerfi
356*6777b538SAndroid Build Coastguard Worker
357*6777b538SAndroid Build Coastguard Workerif [ -z "$NDK_DIR" ]; then
358*6777b538SAndroid Build Coastguard Worker  ANDROID_NDK_ROOT=$(PYTHONPATH=$CHROMIUM_SRC/build/android python3 -c \
359*6777b538SAndroid Build Coastguard Worker    'from pylib.constants import ANDROID_NDK_ROOT; print(ANDROID_NDK_ROOT,)')
360*6777b538SAndroid Build Coastguard Workerelse
361*6777b538SAndroid Build Coastguard Worker  if [ ! -d "$NDK_DIR" ]; then
362*6777b538SAndroid Build Coastguard Worker    panic "Invalid directory: $NDK_DIR"
363*6777b538SAndroid Build Coastguard Worker  fi
364*6777b538SAndroid Build Coastguard Worker  if [ ! -f "$NDK_DIR/ndk-build" ]; then
365*6777b538SAndroid Build Coastguard Worker    panic "Not a valid NDK directory: $NDK_DIR"
366*6777b538SAndroid Build Coastguard Worker  fi
367*6777b538SAndroid Build Coastguard Worker  ANDROID_NDK_ROOT=$NDK_DIR
368*6777b538SAndroid Build Coastguard Workerfi
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Workerif [ "$GDBINIT" -a ! -f "$GDBINIT" ]; then
371*6777b538SAndroid Build Coastguard Worker  panic "Unknown --script file: $GDBINIT"
372*6777b538SAndroid Build Coastguard Workerfi
373*6777b538SAndroid Build Coastguard Worker
374*6777b538SAndroid Build Coastguard Worker# Check that ADB is in our path
375*6777b538SAndroid Build Coastguard Workerif [ -z "$ADB" ]; then
376*6777b538SAndroid Build Coastguard Worker  ADB=$(which adb 2>/dev/null)
377*6777b538SAndroid Build Coastguard Worker  if [ -z "$ADB" ]; then
378*6777b538SAndroid Build Coastguard Worker    panic "Can't find 'adb' tool in your path. Install it or use \
379*6777b538SAndroid Build Coastguard Worker--adb=<file>"
380*6777b538SAndroid Build Coastguard Worker  fi
381*6777b538SAndroid Build Coastguard Worker  log "Auto-config: --adb=$ADB"
382*6777b538SAndroid Build Coastguard Workerfi
383*6777b538SAndroid Build Coastguard Worker
384*6777b538SAndroid Build Coastguard Worker# Check that it works minimally
385*6777b538SAndroid Build Coastguard WorkerADB_VERSION=$($ADB version 2>/dev/null)
386*6777b538SAndroid Build Coastguard Workerecho "$ADB_VERSION" | fgrep -q -e "Android Debug Bridge"
387*6777b538SAndroid Build Coastguard Workerif [ $? != 0 ]; then
388*6777b538SAndroid Build Coastguard Worker  panic "Your 'adb' tool seems invalid, use --adb=<file> to specify a \
389*6777b538SAndroid Build Coastguard Workerdifferent one: $ADB"
390*6777b538SAndroid Build Coastguard Workerfi
391*6777b538SAndroid Build Coastguard Worker
392*6777b538SAndroid Build Coastguard Worker# If there are more than one device connected, and ANDROID_SERIAL is not
393*6777b538SAndroid Build Coastguard Worker# defined, print an error message.
394*6777b538SAndroid Build Coastguard WorkerNUM_DEVICES_PLUS2=$($ADB devices 2>/dev/null | wc -l)
395*6777b538SAndroid Build Coastguard Workerif [ "$NUM_DEVICES_PLUS2" -gt 3 -a -z "$ANDROID_SERIAL" ]; then
396*6777b538SAndroid Build Coastguard Worker  echo "ERROR: There is more than one Android device connected to ADB."
397*6777b538SAndroid Build Coastguard Worker  echo "Please define ANDROID_SERIAL to specify which one to use."
398*6777b538SAndroid Build Coastguard Worker  exit 1
399*6777b538SAndroid Build Coastguard Workerfi
400*6777b538SAndroid Build Coastguard Worker
401*6777b538SAndroid Build Coastguard Worker# Run a command through adb shell, strip the extra \r from the output
402*6777b538SAndroid Build Coastguard Worker# and return the correct status code to detect failures. This assumes
403*6777b538SAndroid Build Coastguard Worker# that the adb shell command prints a final \n to stdout.
404*6777b538SAndroid Build Coastguard Worker# $1+: command to run
405*6777b538SAndroid Build Coastguard Worker# Out: command's stdout
406*6777b538SAndroid Build Coastguard Worker# Return: command's status
407*6777b538SAndroid Build Coastguard Worker# Note: the command's stderr is lost
408*6777b538SAndroid Build Coastguard Workeradb_shell () {
409*6777b538SAndroid Build Coastguard Worker  local TMPOUT="$(mktemp)"
410*6777b538SAndroid Build Coastguard Worker  local LASTLINE RET
411*6777b538SAndroid Build Coastguard Worker  local ADB=${ADB:-adb}
412*6777b538SAndroid Build Coastguard Worker
413*6777b538SAndroid Build Coastguard Worker  # The weird sed rule is to strip the final \r on each output line
414*6777b538SAndroid Build Coastguard Worker  # Since 'adb shell' never returns the command's proper exit/status code,
415*6777b538SAndroid Build Coastguard Worker  # we force it to print it as '%%<status>' in the temporary output file,
416*6777b538SAndroid Build Coastguard Worker  # which we will later strip from it.
417*6777b538SAndroid Build Coastguard Worker  $ADB shell $@ ";" echo "%%\$?" 2>/dev/null | \
418*6777b538SAndroid Build Coastguard Worker      sed -e 's![[:cntrl:]]!!g' > $TMPOUT
419*6777b538SAndroid Build Coastguard Worker  # Get last line in log, which contains the exit code from the command
420*6777b538SAndroid Build Coastguard Worker  LASTLINE=$(sed -e '$!d' $TMPOUT)
421*6777b538SAndroid Build Coastguard Worker  # Extract the status code from the end of the line, which must
422*6777b538SAndroid Build Coastguard Worker  # be '%%<code>'.
423*6777b538SAndroid Build Coastguard Worker  RET=$(echo "$LASTLINE" | \
424*6777b538SAndroid Build Coastguard Worker    awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,RSTART+2); } }')
425*6777b538SAndroid Build Coastguard Worker  # Remove the status code from the last line. Note that this may result
426*6777b538SAndroid Build Coastguard Worker  # in an empty line.
427*6777b538SAndroid Build Coastguard Worker  LASTLINE=$(echo "$LASTLINE" | \
428*6777b538SAndroid Build Coastguard Worker    awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,1,RSTART-1); } }')
429*6777b538SAndroid Build Coastguard Worker  # The output itself: all lines except the status code.
430*6777b538SAndroid Build Coastguard Worker  sed -e '$d' $TMPOUT && printf "%s" "$LASTLINE"
431*6777b538SAndroid Build Coastguard Worker  # Remove temp file.
432*6777b538SAndroid Build Coastguard Worker  rm -f $TMPOUT
433*6777b538SAndroid Build Coastguard Worker  # Exit with the appropriate status.
434*6777b538SAndroid Build Coastguard Worker  return $RET
435*6777b538SAndroid Build Coastguard Worker}
436*6777b538SAndroid Build Coastguard Worker
437*6777b538SAndroid Build Coastguard Worker# Find the target architecture from a local shared library.
438*6777b538SAndroid Build Coastguard Worker# This returns an NDK-compatible architecture name.
439*6777b538SAndroid Build Coastguard Worker# out: NDK Architecture name, or empty string.
440*6777b538SAndroid Build Coastguard Workerget_gyp_target_arch () {
441*6777b538SAndroid Build Coastguard Worker  # ls prints a broken pipe error when there are a lot of libs.
442*6777b538SAndroid Build Coastguard Worker  local RANDOM_LIB=$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null| head -n1)
443*6777b538SAndroid Build Coastguard Worker  local SO_DESC=$(file $RANDOM_LIB)
444*6777b538SAndroid Build Coastguard Worker  case $ARCH in
445*6777b538SAndroid Build Coastguard Worker    *32-bit*ARM,*) echo "arm";;
446*6777b538SAndroid Build Coastguard Worker    *64-bit*ARM,*) echo "arm64";;
447*6777b538SAndroid Build Coastguard Worker    *32-bit*Intel,*) echo "x86";;
448*6777b538SAndroid Build Coastguard Worker    *x86-64,*) echo "x86_64";;
449*6777b538SAndroid Build Coastguard Worker    *32-bit*MIPS,*) echo "mips";;
450*6777b538SAndroid Build Coastguard Worker    *) echo "";
451*6777b538SAndroid Build Coastguard Worker  esac
452*6777b538SAndroid Build Coastguard Worker}
453*6777b538SAndroid Build Coastguard Worker
454*6777b538SAndroid Build Coastguard Workerif [ -z "$TARGET_ARCH" ]; then
455*6777b538SAndroid Build Coastguard Worker  TARGET_ARCH=$(get_gyp_target_arch)
456*6777b538SAndroid Build Coastguard Worker  if [ -z "$TARGET_ARCH" ]; then
457*6777b538SAndroid Build Coastguard Worker    TARGET_ARCH=arm
458*6777b538SAndroid Build Coastguard Worker  fi
459*6777b538SAndroid Build Coastguard Workerelse
460*6777b538SAndroid Build Coastguard Worker  # Nit: accept Chromium's 'ia32' as a valid target architecture. This
461*6777b538SAndroid Build Coastguard Worker  # script prefers the NDK 'x86' name instead because it uses it to find
462*6777b538SAndroid Build Coastguard Worker  # NDK-specific files (host gdb) with it.
463*6777b538SAndroid Build Coastguard Worker  if [ "$TARGET_ARCH" = "ia32" ]; then
464*6777b538SAndroid Build Coastguard Worker    TARGET_ARCH=x86
465*6777b538SAndroid Build Coastguard Worker    log "Auto-config: --arch=$TARGET_ARCH  (equivalent to ia32)"
466*6777b538SAndroid Build Coastguard Worker  fi
467*6777b538SAndroid Build Coastguard Workerfi
468*6777b538SAndroid Build Coastguard Worker
469*6777b538SAndroid Build Coastguard Worker# Detect the NDK system name, i.e. the name used to identify the host.
470*6777b538SAndroid Build Coastguard Worker# out: NDK system name (e.g. 'linux' or 'darwin')
471*6777b538SAndroid Build Coastguard Workerget_ndk_host_system () {
472*6777b538SAndroid Build Coastguard Worker  local HOST_OS
473*6777b538SAndroid Build Coastguard Worker  if [ -z "$NDK_HOST_SYSTEM" ]; then
474*6777b538SAndroid Build Coastguard Worker    HOST_OS=$(uname -s)
475*6777b538SAndroid Build Coastguard Worker    case $HOST_OS in
476*6777b538SAndroid Build Coastguard Worker      Linux) NDK_HOST_SYSTEM=linux;;
477*6777b538SAndroid Build Coastguard Worker      Darwin) NDK_HOST_SYSTEM=darwin;;
478*6777b538SAndroid Build Coastguard Worker      *) panic "You can't run this script on this system: $HOST_OS";;
479*6777b538SAndroid Build Coastguard Worker    esac
480*6777b538SAndroid Build Coastguard Worker  fi
481*6777b538SAndroid Build Coastguard Worker  echo "$NDK_HOST_SYSTEM"
482*6777b538SAndroid Build Coastguard Worker}
483*6777b538SAndroid Build Coastguard Worker
484*6777b538SAndroid Build Coastguard Worker# Detect the NDK host architecture name.
485*6777b538SAndroid Build Coastguard Worker# out: NDK arch name (e.g. 'x86' or 'x86_64')
486*6777b538SAndroid Build Coastguard Workerget_ndk_host_arch () {
487*6777b538SAndroid Build Coastguard Worker  local HOST_ARCH HOST_OS
488*6777b538SAndroid Build Coastguard Worker  if [ -z "$NDK_HOST_ARCH" ]; then
489*6777b538SAndroid Build Coastguard Worker    HOST_OS=$(get_ndk_host_system)
490*6777b538SAndroid Build Coastguard Worker    HOST_ARCH=$(uname -p)
491*6777b538SAndroid Build Coastguard Worker    if [ "$HOST_ARCH" = "unknown" ]; then
492*6777b538SAndroid Build Coastguard Worker      # In case where "-p" returns "unknown" just use "-m" (machine hardware
493*6777b538SAndroid Build Coastguard Worker      # name). According to this patch from Fedora "-p" is equivalent to "-m"
494*6777b538SAndroid Build Coastguard Worker      # anyway: https://goo.gl/Pd47x3
495*6777b538SAndroid Build Coastguard Worker      HOST_ARCH=$(uname -m)
496*6777b538SAndroid Build Coastguard Worker    fi
497*6777b538SAndroid Build Coastguard Worker    case $HOST_ARCH in
498*6777b538SAndroid Build Coastguard Worker      i?86) NDK_HOST_ARCH=x86;;
499*6777b538SAndroid Build Coastguard Worker      x86_64|amd64) NDK_HOST_ARCH=x86_64;;
500*6777b538SAndroid Build Coastguard Worker      *) panic "You can't run this script on this host architecture: $HOST_ARCH";;
501*6777b538SAndroid Build Coastguard Worker    esac
502*6777b538SAndroid Build Coastguard Worker    # Darwin trick: "uname -p" always returns i386 on 64-bit installations.
503*6777b538SAndroid Build Coastguard Worker    if [ "$HOST_OS" = darwin -a "$NDK_HOST_ARCH" = "x86" ]; then
504*6777b538SAndroid Build Coastguard Worker      # Use '/usr/bin/file', not just 'file' to avoid buggy MacPorts
505*6777b538SAndroid Build Coastguard Worker      # implementations of the tool. See http://b.android.com/53769
506*6777b538SAndroid Build Coastguard Worker      HOST_64BITS=$(/usr/bin/file -L "$SHELL" | grep -e "x86[_-]64")
507*6777b538SAndroid Build Coastguard Worker      if [ "$HOST_64BITS" ]; then
508*6777b538SAndroid Build Coastguard Worker        NDK_HOST_ARCH=x86_64
509*6777b538SAndroid Build Coastguard Worker      fi
510*6777b538SAndroid Build Coastguard Worker    fi
511*6777b538SAndroid Build Coastguard Worker  fi
512*6777b538SAndroid Build Coastguard Worker  echo "$NDK_HOST_ARCH"
513*6777b538SAndroid Build Coastguard Worker}
514*6777b538SAndroid Build Coastguard Worker
515*6777b538SAndroid Build Coastguard Worker# Convert an NDK architecture name into a GNU configure triplet.
516*6777b538SAndroid Build Coastguard Worker# $1: NDK architecture name (e.g. 'arm')
517*6777b538SAndroid Build Coastguard Worker# Out: Android GNU configure triplet (e.g. 'arm-linux-androideabi')
518*6777b538SAndroid Build Coastguard Workerget_arch_gnu_config () {
519*6777b538SAndroid Build Coastguard Worker  case $1 in
520*6777b538SAndroid Build Coastguard Worker    arm)
521*6777b538SAndroid Build Coastguard Worker      echo "arm-linux-androideabi"
522*6777b538SAndroid Build Coastguard Worker      ;;
523*6777b538SAndroid Build Coastguard Worker    arm64)
524*6777b538SAndroid Build Coastguard Worker      echo "aarch64-linux-android"
525*6777b538SAndroid Build Coastguard Worker      ;;
526*6777b538SAndroid Build Coastguard Worker    x86)
527*6777b538SAndroid Build Coastguard Worker      echo "i686-linux-android"
528*6777b538SAndroid Build Coastguard Worker      ;;
529*6777b538SAndroid Build Coastguard Worker    x86_64)
530*6777b538SAndroid Build Coastguard Worker      echo "x86_64-linux-android"
531*6777b538SAndroid Build Coastguard Worker      ;;
532*6777b538SAndroid Build Coastguard Worker    mips)
533*6777b538SAndroid Build Coastguard Worker      echo "mipsel-linux-android"
534*6777b538SAndroid Build Coastguard Worker      ;;
535*6777b538SAndroid Build Coastguard Worker    *)
536*6777b538SAndroid Build Coastguard Worker      echo "$ARCH-linux-android"
537*6777b538SAndroid Build Coastguard Worker      ;;
538*6777b538SAndroid Build Coastguard Worker  esac
539*6777b538SAndroid Build Coastguard Worker}
540*6777b538SAndroid Build Coastguard Worker
541*6777b538SAndroid Build Coastguard Worker# Convert an NDK architecture name into a toolchain name prefix
542*6777b538SAndroid Build Coastguard Worker# $1: NDK architecture name (e.g. 'arm')
543*6777b538SAndroid Build Coastguard Worker# Out: NDK toolchain name prefix (e.g. 'arm-linux-androideabi')
544*6777b538SAndroid Build Coastguard Workerget_arch_toolchain_prefix () {
545*6777b538SAndroid Build Coastguard Worker  # Return the configure triplet, except for x86 and x86_64!
546*6777b538SAndroid Build Coastguard Worker  if [ "$1" = "x86" -o "$1" = "x86_64" ]; then
547*6777b538SAndroid Build Coastguard Worker    echo "$1"
548*6777b538SAndroid Build Coastguard Worker  else
549*6777b538SAndroid Build Coastguard Worker    get_arch_gnu_config $1
550*6777b538SAndroid Build Coastguard Worker  fi
551*6777b538SAndroid Build Coastguard Worker}
552*6777b538SAndroid Build Coastguard Worker
553*6777b538SAndroid Build Coastguard Worker# Find a NDK toolchain prebuilt file or sub-directory.
554*6777b538SAndroid Build Coastguard Worker# This will probe the various arch-specific toolchain directories
555*6777b538SAndroid Build Coastguard Worker# in the NDK for the needed file.
556*6777b538SAndroid Build Coastguard Worker# $1: NDK install path
557*6777b538SAndroid Build Coastguard Worker# $2: NDK architecture name
558*6777b538SAndroid Build Coastguard Worker# $3: prebuilt sub-path to look for.
559*6777b538SAndroid Build Coastguard Worker# Out: file path, or empty if none is found.
560*6777b538SAndroid Build Coastguard Workerget_ndk_toolchain_prebuilt () {
561*6777b538SAndroid Build Coastguard Worker  local NDK_DIR="${1%/}"
562*6777b538SAndroid Build Coastguard Worker  local ARCH="$2"
563*6777b538SAndroid Build Coastguard Worker  local SUBPATH="$3"
564*6777b538SAndroid Build Coastguard Worker  local NAME="$(get_arch_toolchain_prefix $ARCH)"
565*6777b538SAndroid Build Coastguard Worker  local FILE TARGET
566*6777b538SAndroid Build Coastguard Worker  FILE=$NDK_DIR/toolchains/$NAME-4.9/prebuilt/$SUBPATH
567*6777b538SAndroid Build Coastguard Worker  if [ ! -f "$FILE" ]; then
568*6777b538SAndroid Build Coastguard Worker    FILE=$NDK_DIR/toolchains/$NAME-4.8/prebuilt/$SUBPATH
569*6777b538SAndroid Build Coastguard Worker    if [ ! -f "$FILE" ]; then
570*6777b538SAndroid Build Coastguard Worker      FILE=
571*6777b538SAndroid Build Coastguard Worker    fi
572*6777b538SAndroid Build Coastguard Worker  fi
573*6777b538SAndroid Build Coastguard Worker  echo "$FILE"
574*6777b538SAndroid Build Coastguard Worker}
575*6777b538SAndroid Build Coastguard Worker
576*6777b538SAndroid Build Coastguard Worker# $1: NDK install path
577*6777b538SAndroid Build Coastguard Workerget_ndk_host_gdb_client() {
578*6777b538SAndroid Build Coastguard Worker  local NDK_DIR="$1"
579*6777b538SAndroid Build Coastguard Worker  local HOST_OS HOST_ARCH
580*6777b538SAndroid Build Coastguard Worker
581*6777b538SAndroid Build Coastguard Worker  HOST_OS=$(get_ndk_host_system)
582*6777b538SAndroid Build Coastguard Worker  HOST_ARCH=$(get_ndk_host_arch)
583*6777b538SAndroid Build Coastguard Worker  echo "$NDK_DIR/prebuilt/$HOST_OS-$HOST_ARCH/bin/gdb"
584*6777b538SAndroid Build Coastguard Worker}
585*6777b538SAndroid Build Coastguard Worker
586*6777b538SAndroid Build Coastguard Worker# $1: NDK install path
587*6777b538SAndroid Build Coastguard Worker# $2: target architecture.
588*6777b538SAndroid Build Coastguard Workerget_ndk_gdbserver () {
589*6777b538SAndroid Build Coastguard Worker  local NDK_DIR="$1"
590*6777b538SAndroid Build Coastguard Worker  local ARCH=$2
591*6777b538SAndroid Build Coastguard Worker  local BINARY
592*6777b538SAndroid Build Coastguard Worker
593*6777b538SAndroid Build Coastguard Worker  # The location has moved after NDK r8
594*6777b538SAndroid Build Coastguard Worker  BINARY=$NDK_DIR/prebuilt/android-$ARCH/gdbserver/gdbserver
595*6777b538SAndroid Build Coastguard Worker  if [ ! -f "$BINARY" ]; then
596*6777b538SAndroid Build Coastguard Worker    BINARY=$(get_ndk_toolchain_prebuilt "$NDK_DIR" "$ARCH" gdbserver)
597*6777b538SAndroid Build Coastguard Worker  fi
598*6777b538SAndroid Build Coastguard Worker  echo "$BINARY"
599*6777b538SAndroid Build Coastguard Worker}
600*6777b538SAndroid Build Coastguard Worker
601*6777b538SAndroid Build Coastguard Worker# Find host GDB client binary
602*6777b538SAndroid Build Coastguard Workerif [ -z "$GDB" ]; then
603*6777b538SAndroid Build Coastguard Worker  GDB=$(get_ndk_host_gdb_client "$ANDROID_NDK_ROOT")
604*6777b538SAndroid Build Coastguard Worker  if [ -z "$GDB" ]; then
605*6777b538SAndroid Build Coastguard Worker    panic "Can't find Android gdb client in your path, check your \
606*6777b538SAndroid Build Coastguard Worker--toolchain or --gdb path."
607*6777b538SAndroid Build Coastguard Worker  fi
608*6777b538SAndroid Build Coastguard Worker  log "Host gdb client: $GDB"
609*6777b538SAndroid Build Coastguard Workerfi
610*6777b538SAndroid Build Coastguard Worker
611*6777b538SAndroid Build Coastguard Worker# Find gdbserver binary, we will later push it to /data/local/tmp
612*6777b538SAndroid Build Coastguard Worker# This ensures that both gdbserver and $GDB talk the same binary protocol,
613*6777b538SAndroid Build Coastguard Worker# otherwise weird problems will appear.
614*6777b538SAndroid Build Coastguard Worker#
615*6777b538SAndroid Build Coastguard Workerif [ -z "$GDBSERVER" ]; then
616*6777b538SAndroid Build Coastguard Worker  GDBSERVER=$(get_ndk_gdbserver "$ANDROID_NDK_ROOT" "$TARGET_ARCH")
617*6777b538SAndroid Build Coastguard Worker  if [ -z "$GDBSERVER" ]; then
618*6777b538SAndroid Build Coastguard Worker    panic "Can't find NDK gdbserver binary. use --gdbserver to specify \
619*6777b538SAndroid Build Coastguard Workervalid one!"
620*6777b538SAndroid Build Coastguard Worker  fi
621*6777b538SAndroid Build Coastguard Worker  log "Auto-config: --gdbserver=$GDBSERVER"
622*6777b538SAndroid Build Coastguard Workerfi
623*6777b538SAndroid Build Coastguard Worker
624*6777b538SAndroid Build Coastguard Worker# A unique ID for this script's session. This needs to be the same in all
625*6777b538SAndroid Build Coastguard Worker# sub-shell commands we're going to launch, so take the PID of the launcher
626*6777b538SAndroid Build Coastguard Worker# process.
627*6777b538SAndroid Build Coastguard WorkerTMP_ID=$$
628*6777b538SAndroid Build Coastguard Worker
629*6777b538SAndroid Build Coastguard Worker# Temporary directory, will get cleaned up on exit.
630*6777b538SAndroid Build Coastguard WorkerTMPDIR=/tmp/$USER-adb-gdb-tmp-$TMP_ID
631*6777b538SAndroid Build Coastguard Workermkdir -p "$TMPDIR" && rm -rf "$TMPDIR"/*
632*6777b538SAndroid Build Coastguard Worker
633*6777b538SAndroid Build Coastguard WorkerGDBSERVER_PIDFILE="$TMPDIR"/gdbserver-$TMP_ID.pid
634*6777b538SAndroid Build Coastguard Worker
635*6777b538SAndroid Build Coastguard Worker# Return the timestamp of a given file, as number of seconds since epoch.
636*6777b538SAndroid Build Coastguard Worker# $1: file path
637*6777b538SAndroid Build Coastguard Worker# Out: file timestamp
638*6777b538SAndroid Build Coastguard Workerget_file_timestamp () {
639*6777b538SAndroid Build Coastguard Worker  stat -c %Y "$1" 2>/dev/null
640*6777b538SAndroid Build Coastguard Worker}
641*6777b538SAndroid Build Coastguard Worker
642*6777b538SAndroid Build Coastguard Worker# Allow several concurrent debugging sessions
643*6777b538SAndroid Build Coastguard WorkerAPP_DATA_DIR=$(adb_shell run-as $PACKAGE_NAME /system/bin/sh -c pwd)
644*6777b538SAndroid Build Coastguard Workerfail_panic "Failed to run-as $PACKAGE_NAME, is the app debuggable?"
645*6777b538SAndroid Build Coastguard WorkerTARGET_GDBSERVER="$APP_DATA_DIR/gdbserver-adb-gdb-$TMP_ID"
646*6777b538SAndroid Build Coastguard WorkerTMP_TARGET_GDBSERVER=/data/local/tmp/gdbserver-adb-gdb-$TMP_ID
647*6777b538SAndroid Build Coastguard Worker
648*6777b538SAndroid Build Coastguard Worker# Select correct app_process for architecture.
649*6777b538SAndroid Build Coastguard Workercase $TARGET_ARCH in
650*6777b538SAndroid Build Coastguard Worker      arm|x86|mips) GDBEXEC=app_process32;;
651*6777b538SAndroid Build Coastguard Worker      arm64|x86_64) GDBEXEC=app_process64; SUFFIX_64_BIT=64;;
652*6777b538SAndroid Build Coastguard Worker      *) panic "Unknown app_process for architecture!";;
653*6777b538SAndroid Build Coastguard Workeresac
654*6777b538SAndroid Build Coastguard Worker
655*6777b538SAndroid Build Coastguard Worker# Default to app_process if bit-width specific process isn't found.
656*6777b538SAndroid Build Coastguard Workeradb_shell ls /system/bin/$GDBEXEC > /dev/null
657*6777b538SAndroid Build Coastguard Workerif [ $? != 0 ]; then
658*6777b538SAndroid Build Coastguard Worker    GDBEXEC=app_process
659*6777b538SAndroid Build Coastguard Workerfi
660*6777b538SAndroid Build Coastguard Worker
661*6777b538SAndroid Build Coastguard Worker# Detect AddressSanitizer setup on the device. In that case app_process is a
662*6777b538SAndroid Build Coastguard Worker# script, and the real executable is app_process.real.
663*6777b538SAndroid Build Coastguard WorkerGDBEXEC_ASAN=app_process.real
664*6777b538SAndroid Build Coastguard Workeradb_shell ls /system/bin/$GDBEXEC_ASAN > /dev/null
665*6777b538SAndroid Build Coastguard Workerif [ $? == 0 ]; then
666*6777b538SAndroid Build Coastguard Worker    GDBEXEC=$GDBEXEC_ASAN
667*6777b538SAndroid Build Coastguard Workerfi
668*6777b538SAndroid Build Coastguard Worker
669*6777b538SAndroid Build Coastguard WorkerORG_PULL_LIBS_DIR=$PULL_LIBS_DIR
670*6777b538SAndroid Build Coastguard Workerif [[ -n "$ANDROID_SERIAL" ]]; then
671*6777b538SAndroid Build Coastguard Worker  DEFAULT_PULL_LIBS_DIR="$DEFAULT_PULL_LIBS_DIR/$ANDROID_SERIAL-$SUFFIX_64_BIT"
672*6777b538SAndroid Build Coastguard Workerfi
673*6777b538SAndroid Build Coastguard WorkerPULL_LIBS_DIR=${PULL_LIBS_DIR:-$DEFAULT_PULL_LIBS_DIR}
674*6777b538SAndroid Build Coastguard Worker
675*6777b538SAndroid Build Coastguard WorkerHOST_FINGERPRINT=
676*6777b538SAndroid Build Coastguard WorkerDEVICE_FINGERPRINT=$(adb_shell getprop ro.build.fingerprint)
677*6777b538SAndroid Build Coastguard Worker[[ "$DEVICE_FINGERPRINT" ]] || panic "Failed to get the device fingerprint"
678*6777b538SAndroid Build Coastguard Workerlog "Device build fingerprint: $DEVICE_FINGERPRINT"
679*6777b538SAndroid Build Coastguard Worker
680*6777b538SAndroid Build Coastguard Workerif [ ! -f "$PULL_LIBS_DIR/build.fingerprint" ]; then
681*6777b538SAndroid Build Coastguard Worker  log "Auto-config: --pull-libs  (no cached libraries)"
682*6777b538SAndroid Build Coastguard Worker  PULL_LIBS=true
683*6777b538SAndroid Build Coastguard Workerelse
684*6777b538SAndroid Build Coastguard Worker  HOST_FINGERPRINT=$(< "$PULL_LIBS_DIR/build.fingerprint")
685*6777b538SAndroid Build Coastguard Worker  log "Host build fingerprint:   $HOST_FINGERPRINT"
686*6777b538SAndroid Build Coastguard Worker  if [ "$HOST_FINGERPRINT" == "$DEVICE_FINGERPRINT" ]; then
687*6777b538SAndroid Build Coastguard Worker    log "Auto-config: --no-pull-libs (fingerprint match)"
688*6777b538SAndroid Build Coastguard Worker    NO_PULL_LIBS=true
689*6777b538SAndroid Build Coastguard Worker  else
690*6777b538SAndroid Build Coastguard Worker    log "Auto-config: --pull-libs  (fingerprint mismatch)"
691*6777b538SAndroid Build Coastguard Worker    PULL_LIBS=true
692*6777b538SAndroid Build Coastguard Worker  fi
693*6777b538SAndroid Build Coastguard Workerfi
694*6777b538SAndroid Build Coastguard Worker
695*6777b538SAndroid Build Coastguard Worker# If requested, work for M-x gdb.  The gdb indirections make it
696*6777b538SAndroid Build Coastguard Worker# difficult to pass --annotate=3 to the gdb binary itself.
697*6777b538SAndroid Build Coastguard Workerif [ "$ANNOTATE" ]; then
698*6777b538SAndroid Build Coastguard Worker  GDB_ARGS=$GDB_ARGS" --annotate=$ANNOTATE"
699*6777b538SAndroid Build Coastguard Workerfi
700*6777b538SAndroid Build Coastguard Worker
701*6777b538SAndroid Build Coastguard Worker# Get the PID from the first argument or else find the PID of the
702*6777b538SAndroid Build Coastguard Worker# browser process.
703*6777b538SAndroid Build Coastguard Workerif [ -z "$PID" ]; then
704*6777b538SAndroid Build Coastguard Worker  PROCESSNAME=$PACKAGE_NAME
705*6777b538SAndroid Build Coastguard Worker  if [ -z "$PID" ]; then
706*6777b538SAndroid Build Coastguard Worker    PID=$(adb_shell ps | \
707*6777b538SAndroid Build Coastguard Worker          awk '$9 == "'$PROCESSNAME'" { print $2; }' | head -1)
708*6777b538SAndroid Build Coastguard Worker  fi
709*6777b538SAndroid Build Coastguard Worker  if [ -z "$PID" ]; then
710*6777b538SAndroid Build Coastguard Worker    panic "Can't find application process PID."
711*6777b538SAndroid Build Coastguard Worker  fi
712*6777b538SAndroid Build Coastguard Worker  log "Found process PID: $PID"
713*6777b538SAndroid Build Coastguard Workerfi
714*6777b538SAndroid Build Coastguard Worker
715*6777b538SAndroid Build Coastguard Worker# Determine if 'adb shell' runs as root or not.
716*6777b538SAndroid Build Coastguard Worker# If so, we can launch gdbserver directly, otherwise, we have to
717*6777b538SAndroid Build Coastguard Worker# use run-as $PACKAGE_NAME ..., which requires the package to be debuggable.
718*6777b538SAndroid Build Coastguard Worker#
719*6777b538SAndroid Build Coastguard Workerif [ "$SU_PREFIX" ]; then
720*6777b538SAndroid Build Coastguard Worker  # Need to check that this works properly.
721*6777b538SAndroid Build Coastguard Worker  SU_PREFIX_TEST_LOG=$TMPDIR/su-prefix.log
722*6777b538SAndroid Build Coastguard Worker  adb_shell $SU_PREFIX \"echo "foo"\" > $SU_PREFIX_TEST_LOG 2>&1
723*6777b538SAndroid Build Coastguard Worker  if [ $? != 0 -o "$(cat $SU_PREFIX_TEST_LOG)" != "foo" ]; then
724*6777b538SAndroid Build Coastguard Worker    echo "ERROR: Cannot use '$SU_PREFIX' as a valid su prefix:"
725*6777b538SAndroid Build Coastguard Worker    echo "$ adb shell $SU_PREFIX \"echo foo\""
726*6777b538SAndroid Build Coastguard Worker    cat $SU_PREFIX_TEST_LOG
727*6777b538SAndroid Build Coastguard Worker    exit 1
728*6777b538SAndroid Build Coastguard Worker  fi
729*6777b538SAndroid Build Coastguard Worker  COMMAND_PREFIX="$SU_PREFIX \""
730*6777b538SAndroid Build Coastguard Worker  COMMAND_SUFFIX="\""
731*6777b538SAndroid Build Coastguard Workerelse
732*6777b538SAndroid Build Coastguard Worker  SHELL_UID=$("$ADB" shell cat /proc/self/status | \
733*6777b538SAndroid Build Coastguard Worker              awk '$1 == "Uid:" { print $2; }')
734*6777b538SAndroid Build Coastguard Worker  log "Shell UID: $SHELL_UID"
735*6777b538SAndroid Build Coastguard Worker  if [ "$SHELL_UID" != 0 -o -n "$NO_ROOT" ]; then
736*6777b538SAndroid Build Coastguard Worker    COMMAND_PREFIX="run-as $PACKAGE_NAME"
737*6777b538SAndroid Build Coastguard Worker    COMMAND_SUFFIX=
738*6777b538SAndroid Build Coastguard Worker  else
739*6777b538SAndroid Build Coastguard Worker    COMMAND_PREFIX=
740*6777b538SAndroid Build Coastguard Worker    COMMAND_SUFFIX=
741*6777b538SAndroid Build Coastguard Worker  fi
742*6777b538SAndroid Build Coastguard Workerfi
743*6777b538SAndroid Build Coastguard Workerlog "Command prefix: '$COMMAND_PREFIX'"
744*6777b538SAndroid Build Coastguard Workerlog "Command suffix: '$COMMAND_SUFFIX'"
745*6777b538SAndroid Build Coastguard Worker
746*6777b538SAndroid Build Coastguard Workermkdir -p "$PULL_LIBS_DIR"
747*6777b538SAndroid Build Coastguard Workerfail_panic "Can't create --libs-dir directory: $PULL_LIBS_DIR"
748*6777b538SAndroid Build Coastguard Worker
749*6777b538SAndroid Build Coastguard Worker# Pull device's system libraries that are mapped by our process.
750*6777b538SAndroid Build Coastguard Worker# Pulling all system libraries is too long, so determine which ones
751*6777b538SAndroid Build Coastguard Worker# we need by looking at /proc/$PID/maps instead
752*6777b538SAndroid Build Coastguard Workerif [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then
753*6777b538SAndroid Build Coastguard Worker  echo "Extracting system libraries into: $PULL_LIBS_DIR"
754*6777b538SAndroid Build Coastguard Worker  MAPPINGS=$(adb_shell $COMMAND_PREFIX cat /proc/$PID/maps $COMMAND_SUFFIX)
755*6777b538SAndroid Build Coastguard Worker  if [ $? != 0 ]; then
756*6777b538SAndroid Build Coastguard Worker    echo "ERROR: Could not list process's memory mappings."
757*6777b538SAndroid Build Coastguard Worker    if [ "$SU_PREFIX" ]; then
758*6777b538SAndroid Build Coastguard Worker      panic "Are you sure your --su-prefix is correct?"
759*6777b538SAndroid Build Coastguard Worker    else
760*6777b538SAndroid Build Coastguard Worker      panic "Use --su-prefix if the application is not debuggable."
761*6777b538SAndroid Build Coastguard Worker    fi
762*6777b538SAndroid Build Coastguard Worker  fi
763*6777b538SAndroid Build Coastguard Worker  # Remove the fingerprint file in case pulling one of the libs fails.
764*6777b538SAndroid Build Coastguard Worker  rm -f "$PULL_LIBS_DIR/build.fingerprint"
765*6777b538SAndroid Build Coastguard Worker  SYSTEM_LIBS=$(echo "$MAPPINGS" | \
766*6777b538SAndroid Build Coastguard Worker      awk '$6 ~ /\/(system|apex|vendor)\/.*\.so$/ { print $6; }' | sort -u)
767*6777b538SAndroid Build Coastguard Worker  for SYSLIB in /system/bin/linker$SUFFIX_64_BIT $SYSTEM_LIBS; do
768*6777b538SAndroid Build Coastguard Worker    echo "Pulling from device: $SYSLIB"
769*6777b538SAndroid Build Coastguard Worker    DST_FILE=$PULL_LIBS_DIR$SYSLIB
770*6777b538SAndroid Build Coastguard Worker    DST_DIR=$(dirname "$DST_FILE")
771*6777b538SAndroid Build Coastguard Worker    mkdir -p "$DST_DIR" && "$ADB" pull $SYSLIB "$DST_FILE" 2>/dev/null
772*6777b538SAndroid Build Coastguard Worker    fail_panic "Could not pull $SYSLIB from device !?"
773*6777b538SAndroid Build Coastguard Worker  done
774*6777b538SAndroid Build Coastguard Worker  echo "Writing the device fingerprint"
775*6777b538SAndroid Build Coastguard Worker  echo "$DEVICE_FINGERPRINT" > "$PULL_LIBS_DIR/build.fingerprint"
776*6777b538SAndroid Build Coastguard Workerfi
777*6777b538SAndroid Build Coastguard Worker
778*6777b538SAndroid Build Coastguard Worker# Pull the app_process binary from the device.
779*6777b538SAndroid Build Coastguard Workerlog "Pulling $GDBEXEC from device"
780*6777b538SAndroid Build Coastguard Worker"$ADB" pull /system/bin/$GDBEXEC "$TMPDIR"/$GDBEXEC &>/dev/null
781*6777b538SAndroid Build Coastguard Workerfail_panic "Could not retrieve $GDBEXEC from the device!"
782*6777b538SAndroid Build Coastguard Worker
783*6777b538SAndroid Build Coastguard Worker# Find all the sub-directories of $PULL_LIBS_DIR, up to depth 4
784*6777b538SAndroid Build Coastguard Worker# so we can add them to solib-search-path later.
785*6777b538SAndroid Build Coastguard WorkerSOLIB_DIRS=$(find $PULL_LIBS_DIR -mindepth 1 -maxdepth 4 -type d | \
786*6777b538SAndroid Build Coastguard Worker             grep -v "^$" | tr '\n' ':')
787*6777b538SAndroid Build Coastguard WorkerSOLIB_DIRS=${SOLIB_DIRS%:}  # Strip trailing :
788*6777b538SAndroid Build Coastguard Worker
789*6777b538SAndroid Build Coastguard Worker# Applications with minSdkVersion >= 24 will have their data directories
790*6777b538SAndroid Build Coastguard Worker# created with rwx------ permissions, preventing adbd from forwarding to
791*6777b538SAndroid Build Coastguard Worker# the gdbserver socket.
792*6777b538SAndroid Build Coastguard Workeradb_shell $COMMAND_PREFIX chmod a+x $APP_DATA_DIR $COMMAND_SUFFIX
793*6777b538SAndroid Build Coastguard Worker
794*6777b538SAndroid Build Coastguard Worker# Push gdbserver to the device
795*6777b538SAndroid Build Coastguard Workerlog "Pushing gdbserver $GDBSERVER to $TARGET_GDBSERVER"
796*6777b538SAndroid Build Coastguard Worker"$ADB" push $GDBSERVER $TMP_TARGET_GDBSERVER >/dev/null && \
797*6777b538SAndroid Build Coastguard Worker    adb_shell $COMMAND_PREFIX cp $TMP_TARGET_GDBSERVER $TARGET_GDBSERVER $COMMAND_SUFFIX && \
798*6777b538SAndroid Build Coastguard Worker    adb_shell rm $TMP_TARGET_GDBSERVER
799*6777b538SAndroid Build Coastguard Workerfail_panic "Could not copy gdbserver to the device!"
800*6777b538SAndroid Build Coastguard Worker
801*6777b538SAndroid Build Coastguard Workerif [ -z "$PORT" ]; then
802*6777b538SAndroid Build Coastguard Worker  # Random port to allow multiple concurrent sessions.
803*6777b538SAndroid Build Coastguard Worker  PORT=$(( $RANDOM % 1000 + 5039 ))
804*6777b538SAndroid Build Coastguard Workerfi
805*6777b538SAndroid Build Coastguard WorkerHOST_PORT=$PORT
806*6777b538SAndroid Build Coastguard WorkerTARGET_DOMAIN_SOCKET=$APP_DATA_DIR/gdb-socket-$HOST_PORT
807*6777b538SAndroid Build Coastguard Worker
808*6777b538SAndroid Build Coastguard Worker# Setup network redirection
809*6777b538SAndroid Build Coastguard Workerlog "Setting network redirection (host:$HOST_PORT -> device:$TARGET_DOMAIN_SOCKET)"
810*6777b538SAndroid Build Coastguard Worker"$ADB" forward tcp:$HOST_PORT localfilesystem:$TARGET_DOMAIN_SOCKET
811*6777b538SAndroid Build Coastguard Workerfail_panic "Could not setup network redirection from \
812*6777b538SAndroid Build Coastguard Workerhost:localhost:$HOST_PORT to device:$TARGET_DOMAIN_SOCKET"
813*6777b538SAndroid Build Coastguard Worker
814*6777b538SAndroid Build Coastguard Worker# Start gdbserver in the background
815*6777b538SAndroid Build Coastguard Worker# Note that using run-as requires the package to be debuggable.
816*6777b538SAndroid Build Coastguard Worker#
817*6777b538SAndroid Build Coastguard Worker# If not, this will fail horribly. The alternative is to run the
818*6777b538SAndroid Build Coastguard Worker# program as root, which requires of course root privileges.
819*6777b538SAndroid Build Coastguard Worker# Maybe we should add a --root option to enable this?
820*6777b538SAndroid Build Coastguard Worker#
821*6777b538SAndroid Build Coastguard Worker
822*6777b538SAndroid Build Coastguard Workerfor i in 1 2; do
823*6777b538SAndroid Build Coastguard Worker  log "Starting gdbserver in the background:"
824*6777b538SAndroid Build Coastguard Worker  GDBSERVER_LOG=$TMPDIR/gdbserver-$TMP_ID.log
825*6777b538SAndroid Build Coastguard Worker  log "adb shell $COMMAND_PREFIX $TARGET_GDBSERVER \
826*6777b538SAndroid Build Coastguard Worker    --once +$TARGET_DOMAIN_SOCKET \
827*6777b538SAndroid Build Coastguard Worker    --attach $PID $COMMAND_SUFFIX"
828*6777b538SAndroid Build Coastguard Worker  "$ADB" shell $COMMAND_PREFIX $TARGET_GDBSERVER \
829*6777b538SAndroid Build Coastguard Worker    --once +$TARGET_DOMAIN_SOCKET \
830*6777b538SAndroid Build Coastguard Worker    --attach $PID $COMMAND_SUFFIX > $GDBSERVER_LOG 2>&1 &
831*6777b538SAndroid Build Coastguard Worker  GDBSERVER_PID=$!
832*6777b538SAndroid Build Coastguard Worker  echo "$GDBSERVER_PID" > $GDBSERVER_PIDFILE
833*6777b538SAndroid Build Coastguard Worker  log "background job pid: $GDBSERVER_PID"
834*6777b538SAndroid Build Coastguard Worker
835*6777b538SAndroid Build Coastguard Worker  # Sleep to allow gdbserver to attach to the remote process and be
836*6777b538SAndroid Build Coastguard Worker  # ready to connect to.
837*6777b538SAndroid Build Coastguard Worker  log "Sleeping ${ATTACH_DELAY}s to ensure gdbserver is alive"
838*6777b538SAndroid Build Coastguard Worker  sleep "$ATTACH_DELAY"
839*6777b538SAndroid Build Coastguard Worker  log "Job control: $(jobs -l)"
840*6777b538SAndroid Build Coastguard Worker  STATE=$(jobs -l | awk '$2 == "'$GDBSERVER_PID'" { print $3; }')
841*6777b538SAndroid Build Coastguard Worker  if [ "$STATE" != "Running" ]; then
842*6777b538SAndroid Build Coastguard Worker    pid_msg=$(grep "is already traced by process" $GDBSERVER_LOG 2>/dev/null)
843*6777b538SAndroid Build Coastguard Worker    if [[ -n "$pid_msg" ]]; then
844*6777b538SAndroid Build Coastguard Worker      old_pid=${pid_msg##* }
845*6777b538SAndroid Build Coastguard Worker      old_pid=${old_pid//[$'\r\n']}  # Trim trailing \r.
846*6777b538SAndroid Build Coastguard Worker      echo "Killing previous gdb server process (pid=$old_pid)"
847*6777b538SAndroid Build Coastguard Worker      adb_shell $COMMAND_PREFIX kill -9 $old_pid $COMMAND_SUFFIX
848*6777b538SAndroid Build Coastguard Worker      continue
849*6777b538SAndroid Build Coastguard Worker    fi
850*6777b538SAndroid Build Coastguard Worker    echo "ERROR: GDBServer either failed to run or attach to PID $PID!"
851*6777b538SAndroid Build Coastguard Worker    echo "Here is the output from gdbserver (also try --verbose for more):"
852*6777b538SAndroid Build Coastguard Worker    echo "===== gdbserver.log start ====="
853*6777b538SAndroid Build Coastguard Worker    cat $GDBSERVER_LOG
854*6777b538SAndroid Build Coastguard Worker    echo ="===== gdbserver.log end ======"
855*6777b538SAndroid Build Coastguard Worker    exit 1
856*6777b538SAndroid Build Coastguard Worker  fi
857*6777b538SAndroid Build Coastguard Worker  break
858*6777b538SAndroid Build Coastguard Workerdone
859*6777b538SAndroid Build Coastguard Worker
860*6777b538SAndroid Build Coastguard Worker# Generate a file containing useful GDB initialization commands
861*6777b538SAndroid Build Coastguard Workerreadonly COMMANDS=$TMPDIR/gdb.init
862*6777b538SAndroid Build Coastguard Workerlog "Generating GDB initialization commands file: $COMMANDS"
863*6777b538SAndroid Build Coastguard Workercat > "$COMMANDS" <<EOF
864*6777b538SAndroid Build Coastguard Workerset osabi GNU/Linux  # Copied from ndk-gdb.py.
865*6777b538SAndroid Build Coastguard Workerset print pretty 1
866*6777b538SAndroid Build Coastguard Workerpython
867*6777b538SAndroid Build Coastguard Workerimport sys
868*6777b538SAndroid Build Coastguard Workersys.path.insert(0, '$CHROMIUM_SRC/tools/gdb/')
869*6777b538SAndroid Build Coastguard Workertry:
870*6777b538SAndroid Build Coastguard Worker  import gdb_chrome
871*6777b538SAndroid Build Coastguard Workerfinally:
872*6777b538SAndroid Build Coastguard Worker  sys.path.pop(0)
873*6777b538SAndroid Build Coastguard Workerend
874*6777b538SAndroid Build Coastguard Workerfile $TMPDIR/$GDBEXEC
875*6777b538SAndroid Build Coastguard Workerdirectory $CHROMIUM_OUTPUT_DIR
876*6777b538SAndroid Build Coastguard Workerset solib-absolute-prefix $PULL_LIBS_DIR
877*6777b538SAndroid Build Coastguard Workerset solib-search-path $SOLIB_DIRS:$PULL_LIBS_DIR:$SYMBOL_DIR
878*6777b538SAndroid Build Coastguard Worker
879*6777b538SAndroid Build Coastguard Workerpython
880*6777b538SAndroid Build Coastguard Worker# Copied from ndk-gdb.py:
881*6777b538SAndroid Build Coastguard Workerdef target_remote_with_retry(target, timeout_seconds):
882*6777b538SAndroid Build Coastguard Worker  import time
883*6777b538SAndroid Build Coastguard Worker  end_time = time.time() + timeout_seconds
884*6777b538SAndroid Build Coastguard Worker  while True:
885*6777b538SAndroid Build Coastguard Worker    try:
886*6777b538SAndroid Build Coastguard Worker      gdb.execute('target remote ' + target, True)
887*6777b538SAndroid Build Coastguard Worker      return True
888*6777b538SAndroid Build Coastguard Worker    except gdb.error as e:
889*6777b538SAndroid Build Coastguard Worker      time_left = end_time - time.time()
890*6777b538SAndroid Build Coastguard Worker      if time_left < 0 or time_left > timeout_seconds:
891*6777b538SAndroid Build Coastguard Worker        print("Error: unable to connect to device.")
892*6777b538SAndroid Build Coastguard Worker        print(e)
893*6777b538SAndroid Build Coastguard Worker        return False
894*6777b538SAndroid Build Coastguard Worker      time.sleep(min(0.25, time_left))
895*6777b538SAndroid Build Coastguard Worker
896*6777b538SAndroid Build Coastguard Workerprint("Connecting to :$HOST_PORT...")
897*6777b538SAndroid Build Coastguard Workerif target_remote_with_retry(':$HOST_PORT', 5):
898*6777b538SAndroid Build Coastguard Worker  print("Attached! Reading symbols (takes ~30 seconds).")
899*6777b538SAndroid Build Coastguard Workerend
900*6777b538SAndroid Build Coastguard WorkerEOF
901*6777b538SAndroid Build Coastguard Worker
902*6777b538SAndroid Build Coastguard Workerif [ "$GDBINIT" ]; then
903*6777b538SAndroid Build Coastguard Worker  cat "$GDBINIT" >> "$COMMANDS"
904*6777b538SAndroid Build Coastguard Workerfi
905*6777b538SAndroid Build Coastguard Worker
906*6777b538SAndroid Build Coastguard Workerif [ "$VERBOSE" -gt 0 ]; then
907*6777b538SAndroid Build Coastguard Worker  echo "### START $COMMANDS"
908*6777b538SAndroid Build Coastguard Worker  cat "$COMMANDS"
909*6777b538SAndroid Build Coastguard Worker  echo "### END $COMMANDS"
910*6777b538SAndroid Build Coastguard Workerfi
911*6777b538SAndroid Build Coastguard Worker
912*6777b538SAndroid Build Coastguard Workerif [ "$IDE" ]; then
913*6777b538SAndroid Build Coastguard Worker  mkdir -p "$IDE_DIR"
914*6777b538SAndroid Build Coastguard Worker  SYM_GDB="$IDE_DIR/gdb"
915*6777b538SAndroid Build Coastguard Worker  SYM_EXE="$IDE_DIR/app_process"
916*6777b538SAndroid Build Coastguard Worker  SYM_INIT="$IDE_DIR/gdbinit"
917*6777b538SAndroid Build Coastguard Worker  ln -sf "$TMPDIR/$GDBEXEC" "$SYM_EXE"
918*6777b538SAndroid Build Coastguard Worker  ln -sf "$COMMANDS" "$SYM_INIT"
919*6777b538SAndroid Build Coastguard Worker  # gdb doesn't work when symlinked, so create a wrapper.
920*6777b538SAndroid Build Coastguard Worker  echo
921*6777b538SAndroid Build Coastguard Worker  cat > $SYM_GDB <<EOF
922*6777b538SAndroid Build Coastguard Worker#!/bin/sh
923*6777b538SAndroid Build Coastguard Workerexec $GDB "\$@"
924*6777b538SAndroid Build Coastguard WorkerEOF
925*6777b538SAndroid Build Coastguard Worker  chmod u+x $SYM_GDB
926*6777b538SAndroid Build Coastguard Worker
927*6777b538SAndroid Build Coastguard Worker  echo "GDB server listening on: localhost:$PORT"
928*6777b538SAndroid Build Coastguard Worker  echo "GDB wrapper script: $SYM_GDB"
929*6777b538SAndroid Build Coastguard Worker  echo "App executable: $SYM_EXE"
930*6777b538SAndroid Build Coastguard Worker  echo "gdbinit: $SYM_INIT"
931*6777b538SAndroid Build Coastguard Worker  echo "Connect with vscode: https://chromium.googlesource.com/chromium/src/+/main/docs/vscode.md#Launch-Commands"
932*6777b538SAndroid Build Coastguard Worker  echo "Showing gdbserver logs. Press Ctrl-C to disconnect."
933*6777b538SAndroid Build Coastguard Worker  tail -f "$GDBSERVER_LOG"
934*6777b538SAndroid Build Coastguard Workerelse
935*6777b538SAndroid Build Coastguard Worker  log "Launching gdb client: $GDB $GDB_ARGS -x $COMMANDS"
936*6777b538SAndroid Build Coastguard Worker  echo "Server log: $GDBSERVER_LOG"
937*6777b538SAndroid Build Coastguard Worker  if [ "$CGDB" ]; then
938*6777b538SAndroid Build Coastguard Worker    $CGDB -d $GDB -- $GDB_ARGS -x "$COMMANDS"
939*6777b538SAndroid Build Coastguard Worker  else
940*6777b538SAndroid Build Coastguard Worker    $GDB $GDB_ARGS -x "$COMMANDS"
941*6777b538SAndroid Build Coastguard Worker  fi
942*6777b538SAndroid Build Coastguard Workerfi
943