1342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#!/bin/bash
2342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
3342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Copyright (c) 2012 The Chromium Authors. All rights reserved.
4342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Use of this source code is governed by a BSD-style license that can be
5342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# found in the LICENSE file.
6342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
7342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
8342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# A generic script used to attach to a running Chromium process and
9342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# debug it. Most users should not use this directly, but one of the
10342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# wrapper scripts like adb_gdb_content_shell
11342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
12342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Use --help to print full usage instructions.
13342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
14342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
15342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPROGNAME=$(basename "$0")
16342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPROGDIR=$(dirname "$0")
17342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
18342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Force locale to C to allow recognizing output from subprocesses.
19342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochLC_ALL=C
20342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
21342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Location of Chromium-top-level sources.
22342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochCHROMIUM_SRC=$(cd "$PROGDIR"/../.. >/dev/null && pwd 2>/dev/null)
23342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
24342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTMPDIR=
25342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBSERVER_PIDFILE=
26342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTARGET_GDBSERVER=
27342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochCOMMAND_PREFIX=
28342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
29342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochclean_exit () {
30342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$TMPDIR" ]; then
31342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    GDBSERVER_PID=$(cat $GDBSERVER_PIDFILE 2>/dev/null)
32342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$GDBSERVER_PID" ]; then
33342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      log "Killing background gdbserver process: $GDBSERVER_PID"
34342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      kill -9 $GDBSERVER_PID >/dev/null 2>&1
35342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
36342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$TARGET_GDBSERVER" ]; then
37342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      log "Removing target gdbserver binary: $TARGET_GDBSERVER."
38342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      "$ADB" shell "$COMMAND_PREFIX" rm "$TARGET_GDBSERVER" >/dev/null 2>&1
39342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
40342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    log "Cleaning up: $TMPDIR"
41342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    rm -rf "$TMPDIR"
42342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
43342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  trap "" EXIT
44342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  exit $1
45342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
46342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
47342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Ensure clean exit on Ctrl-C or normal exit.
48342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochtrap "clean_exit 1" INT HUP QUIT TERM
49342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochtrap "clean_exit \$?" EXIT
50342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
51342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochpanic () {
52342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "ERROR: $@" >&2
53342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  exit 1
54342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
55342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
56342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfail_panic () {
57342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ $? != 0 ]; then panic "$@"; fi
58342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
59342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
60342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog () {
61342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$VERBOSE" -gt 0 ]; then
62342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "$@"
63342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
64342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
65342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
66342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochDEFAULT_PULL_LIBS_DIR=/tmp/$USER-adb-gdb-libs
67342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
68342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# NOTE: Allow wrapper scripts to set various default through ADB_GDB_XXX
69342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# environment variables. This is only for cosmetic reasons, i.e. to
70342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# display proper
71342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
72342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Allow wrapper scripts to set the default activity through
73342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# the ADB_GDB_ACTIVITY variable. Users are still able to change the
74342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# final activity name through --activity=<name> option.
75342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
76342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# This is only for cosmetic reasons, i.e. to display the proper default
77342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# in the --help output.
78342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
79342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochDEFAULT_ACTIVITY=${ADB_GDB_ACTIVITY:-".Main"}
80342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
81342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Allow wrapper scripts to set the program name through ADB_GDB_PROGNAME
82342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPROGNAME=${ADB_GDB_PROGNAME:-$(basename "$0")}
83342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
84342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochACTIVITY=$DEFAULT_ACTIVITY
85342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochADB=
86342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochANNOTATE=
87342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochFORCE=
88342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBEXEPOSTFIX=gdb
89342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBINIT=
90342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBSERVER=
91342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochHELP=
92342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochNDK_DIR=
93342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochNO_PULL_LIBS=
94342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPACKAGE_NAME=
95342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPID=
96342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPORT=
97342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPRIVILEGED=
98342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPRIVILEGED_INDEX=
99342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPROGRAM_NAME="activity"
100342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPULL_LIBS=
101342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPULL_LIBS_DIR=
102342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSANDBOXED=
103342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSANDBOXED_INDEX=
104342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSTART=
105342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSTART_URL=
106342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochATTACH_DELAY=1
107342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSU_PREFIX=
108342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSYMBOL_DIR=
109342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTARGET_ARCH=
110342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTOOLCHAIN=
111342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochVERBOSE=0
112342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
113342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfor opt; do
114342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
115342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  case $opt in
116342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --adb=*)
117342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ADB=$optarg
118342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
119342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --device=*)
120342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      export ANDROID_SERIAL=$optarg
121342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
122342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --activity=*)
123342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ACTIVITY=$optarg
124342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
125342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --annotate=3)
126342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ANNOTATE=$optarg
127342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
128342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --force)
129342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      FORCE=true
130342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
131342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --gdbserver=*)
132342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      GDBSERVER=$optarg
133342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
134342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --gdb=*)
135342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      GDB=$optarg
136342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
137342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --help|-h|-?)
138342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      HELP=true
139342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
140342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --ndk-dir=*)
141342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      NDK_DIR=$optarg
142342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
143342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --no-pull-libs)
144342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      NO_PULL_LIBS=true
145342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
146342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --package-name=*)
147342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PACKAGE_NAME=$optarg
148342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
149342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --pid=*)
150342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PID=$optarg
151342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
152342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --port=*)
153342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PORT=$optarg
154342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
155342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --privileged)
156342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PRIVILEGED=true
157342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
158342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --privileged=*)
159342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PRIVILEGED=true
160342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PRIVILEGED_INDEX=$optarg
161342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
162342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --program-name=*)
163342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PROGRAM_NAME=$optarg
164342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
165342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --pull-libs)
166342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PULL_LIBS=true
167342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
168342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --pull-libs-dir=*)
169342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PULL_LIBS_DIR=$optarg
170342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
171342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --sandboxed)
172342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      SANDBOXED=true
173342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
174342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --sandboxed=*)
175342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      SANDBOXED=true
176342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      SANDBOXED_INDEX=$optarg
177342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
178342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --script=*)
179342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      GDBINIT=$optarg
180342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
181342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --start=*)
182342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      START_URL=$optarg
183342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;& # fallthrough
184342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --start)
185342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      START=true
186342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
187342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --attach-delay=*)
188342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ATTACH_DELAY=$optarg
189342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
190342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --su-prefix=*)
191342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      SU_PREFIX=$optarg
192342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
193342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --symbol-dir=*)
194342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      SYMBOL_DIR=$optarg
195342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
196342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --output-directory=*)
197342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      CHROMIUM_OUTPUT_DIR=$optarg
198342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
199342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --target-arch=*)
200342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      TARGET_ARCH=$optarg
201342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
202342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --toolchain=*)
203342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      TOOLCHAIN=$optarg
204342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
205342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --ui)
206342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      GDBEXEPOSTFIX=gdbtui
207342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
208342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    --verbose)
209342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      VERBOSE=$(( $VERBOSE + 1 ))
210342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
211342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    -*)
212342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      panic "Unknown option $opt, see --help." >&2
213342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
214342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *)
215342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      if [ "$PACKAGE_NAME" ]; then
216342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch        panic "You can only provide a single package name as argument!\
217342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch See --help."
218342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      fi
219342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PACKAGE_NAME=$opt
220342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
221342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  esac
222342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdone
223342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
224342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$HELP" ]; then
225342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$ADB_GDB_PROGNAME" ]; then
226342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    # Assume wrapper scripts all provide a default package name.
227342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    cat <<EOF
228342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochUsage: $PROGNAME [options]
229342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
230342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochAttach gdb to a running Android $PROGRAM_NAME process.
231342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochEOF
232342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  else
233342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    # Assume this is a direct call to adb_gdb
234342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  cat <<EOF
235342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochUsage: $PROGNAME [options] [<package-name>]
236342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
237342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochAttach gdb to a running Android $PROGRAM_NAME process.
238342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
239342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochIf provided, <package-name> must be the name of the Android application's
240342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochpackage name to be debugged. You can also use --package-name=<name> to
241342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochspecify it.
242342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochEOF
243342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
244342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
245342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  cat <<EOF
246342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
247342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochThis script is used to debug a running $PROGRAM_NAME process.
248342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochThis can be a regular Android application process, sandboxed (if you use the
249342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch--sandboxed or --sandboxed=<num> option) or a privileged (--privileged or
250342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch--privileged=<num>) service.
251342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
252342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochThis script needs several things to work properly. It will try to pick
253342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochthem up automatically for you though:
254342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
255342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch   - target gdbserver binary
256342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch   - host gdb client (e.g. arm-linux-androideabi-gdb)
257342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch   - directory with symbolic version of $PROGRAM_NAME's shared libraries.
258342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
259342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochYou can also use --ndk-dir=<path> to specify an alternative NDK installation
260342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdirectory.
261342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
262342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochThe script tries to find the most recent version of the debug version of
263342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochshared libraries under one of the following directories:
264342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
265342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  \$CHROMIUM_SRC/<out>/lib/                (used by GYP builds)
266342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  \$CHROMIUM_SRC/<out>/lib.unstripped/     (used by GN builds)
267342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
268342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochWhere <out> is determined by CHROMIUM_OUTPUT_DIR, or --output-directory.
269342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
270342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochYou can set the path manually via --symbol-dir.
271342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
272342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochThe script tries to extract the target architecture from your target device,
273342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochbut if this fails, will default to 'arm'. Use --target-arch=<name> to force
274342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochits value.
275342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
276342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochOtherwise, the script will complain, but you can use the --gdbserver,
277342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch--gdb and --symbol-lib options to specify everything manually.
278342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
279342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochAn alternative to --gdb=<file> is to use --toollchain=<path> to specify
280342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochthe path to the host target-specific cross-toolchain.
281342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
282342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochYou will also need the 'adb' tool in your path. Otherwise, use the --adb
283342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochoption. The script will complain if there is more than one device connected
284342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochand a device is not specified with either --device or ANDROID_SERIAL).
285342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
286342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochThe first time you use it on a device, the script will pull many system
287342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlibraries required by the process into a temporary directory. This
288342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochis done to strongly improve the debugging experience, like allowing
289342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochreadable thread stacks and more. The libraries are copied to the following
290342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdirectory by default:
291342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
292342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  $DEFAULT_PULL_LIBS_DIR/
293342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
294342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochBut you can use the --pull-libs-dir=<path> option to specify an
295342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochalternative. The script can detect when you change the connected device,
296342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochand will re-pull the libraries only in this case. You can however force it
297342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochwith the --pull-libs option.
298342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
299342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochAny local .gdbinit script will be ignored, but it is possible to pass a
300342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochgdb command script with the --script=<file> option. Note that its commands
301342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochwill be passed to gdb after the remote connection and library symbol
302342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochloading have completed.
303342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
304342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochValid options:
305342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --help|-h|-?          Print this message.
306342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --verbose             Increase verbosity.
307342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
308342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --sandboxed           Debug first sandboxed process we find.
309342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --sandboxed=<num>     Debug specific sandboxed process.
310342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --symbol-dir=<path>   Specify directory with symbol shared libraries.
311342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --output-directory=<path> Specify the output directory (e.g. "out/Debug").
312342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --package-name=<name> Specify package name (alternative to 1st argument).
313342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --privileged          Debug first privileged process we find.
314342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --privileged=<num>    Debug specific privileged process.
315342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --program-name=<name> Specify program name (cosmetic only).
316342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --pid=<pid>           Specify application process pid.
317342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --force               Kill any previous debugging session, if any.
318342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --start[=<url>]       Start package's activity on device.
319342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --attach-delay=<num>  Seconds to wait for gdbserver to attach to the
320342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                        remote process before starting gdb. Default 1.
321342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                        <num> may be a float if your sleep(1) supports it.
322342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --ui                  Use gdbtui instead of gdb
323342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --activity=<name>     Activity name for --start [$DEFAULT_ACTIVITY].
324342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --annotate=<num>      Enable gdb annotation.
325342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --script=<file>       Specify extra GDB init script.
326342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
327342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --gdbserver=<file>    Specify target gdbserver binary.
328342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --gdb=<file>          Specify host gdb client binary.
329342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --target-arch=<name>  Specify NDK target arch.
330342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --adb=<file>          Specify host ADB binary.
331342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --device=<file>       ADB device serial to use (-s flag).
332342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --port=<port>         Specify the tcp port to use.
333342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
334342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --su-prefix=<prefix>  Prepend <prefix> to 'adb shell' commands that are
335342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                        run by this script. This can be useful to use
336342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                        the 'su' program on rooted production devices.
337342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                        e.g. --su-prefix="su -c"
338342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
339342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --pull-libs           Force system libraries extraction.
340342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --no-pull-libs        Do not extract any system library.
341342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --libs-dir=<path>     Specify system libraries extraction directory.
342342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
343342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochEOF
344342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  exit 0
345342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
346342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
347342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$PACKAGE_NAME" ]; then
348342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  panic "Please specify a package name on the command line. See --help."
349342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
350342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
351342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [[ -z "$SYMBOL_DIR" && -z "$CHROMIUM_OUTPUT_DIR" ]]; then
352342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [[ -e "build.ninja" ]]; then
353342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    CHROMIUM_OUTPUT_DIR=$PWD
354342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  else
355342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Please specify an output directory by using one of:
356342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch       --output-directory=out/Debug
357342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch       CHROMIUM_OUTPUT_DIR=out/Debug
358342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch       Setting working directory to an output directory.
359342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch       See --help."
360342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch   fi
361342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
362342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
363342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Detect the build type and symbol directory. This is done by finding
364342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# the most recent sub-directory containing debug shared libraries under
365342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $CHROMIUM_OUTPUT_DIR.
366342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
367342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: nothing, but this sets SYMBOL_DIR
368342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
369342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdetect_symbol_dir () {
370342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # GYP places unstripped libraries under out/lib
371342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # GN places them under out/lib.unstripped
372342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local PARENT_DIR="$CHROMIUM_OUTPUT_DIR"
373342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [[ ! -e "$PARENT_DIR" ]]; then
374342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PARENT_DIR="$CHROMIUM_SRC/$PARENT_DIR"
375342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
376342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  SYMBOL_DIR="$PARENT_DIR/lib.unstripped"
377342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [[ -z "$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null)" ]]; then
378342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    SYMBOL_DIR="$PARENT_DIR/lib"
379342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [[ -z "$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null)" ]]; then
380342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      panic "Could not find any symbols under \
381342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch$PARENT_DIR/lib{.unstripped}. Please build the program first!"
382342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
383342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
384342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Auto-config: --symbol-dir=$SYMBOL_DIR"
385342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
386342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
387342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$SYMBOL_DIR" ]; then
388342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  detect_symbol_dir
389342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelif [[ -z "$(ls "$SYMBOL_DIR"/lib*.so 2>/dev/null)" ]]; then
390342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  panic "Could not find any symbols under $SYMBOL_DIR"
391342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
392342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
393342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$NDK_DIR" ]; then
394342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ANDROID_NDK_ROOT=$(PYTHONPATH=$CHROMIUM_SRC/build/android python -c \
395342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch'from pylib.constants import ANDROID_NDK_ROOT; print ANDROID_NDK_ROOT,')
396342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelse
397342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ ! -d "$NDK_DIR" ]; then
398342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Invalid directory: $NDK_DIR"
399342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
400342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ ! -f "$NDK_DIR/ndk-build" ]; then
401342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Not a valid NDK directory: $NDK_DIR"
402342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
403342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ANDROID_NDK_ROOT=$NDK_DIR
404342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
405342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
406342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$GDBINIT" -a ! -f "$GDBINIT" ]; then
407342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  panic "Unknown --script file: $GDBINIT"
408342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
409342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
410342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Check that ADB is in our path
411342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$ADB" ]; then
412342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ADB=$(which adb 2>/dev/null)
413342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$ADB" ]; then
414342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Can't find 'adb' tool in your path. Install it or use \
415342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch--adb=<file>"
416342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
417342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Auto-config: --adb=$ADB"
418342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
419342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
420342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Check that it works minimally
421342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochADB_VERSION=$($ADB version 2>/dev/null)
422342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "$ADB_VERSION" | fgrep -q -e "Android Debug Bridge"
423342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ $? != 0 ]; then
424342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  panic "Your 'adb' tool seems invalid, use --adb=<file> to specify a \
425342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdifferent one: $ADB"
426342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
427342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
428342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If there are more than one device connected, and ANDROID_SERIAL is not
429342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# defined, print an error message.
430342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochNUM_DEVICES_PLUS2=$($ADB devices 2>/dev/null | wc -l)
431342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$NUM_DEVICES_PLUS2" -gt 3 -a -z "$ANDROID_SERIAL" ]; then
432342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "ERROR: There is more than one Android device connected to ADB."
433342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "Please define ANDROID_SERIAL to specify which one to use."
434342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  exit 1
435342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
436342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
437342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Run a command through adb shell, strip the extra \r from the output
438342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# and return the correct status code to detect failures. This assumes
439342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# that the adb shell command prints a final \n to stdout.
440342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1+: command to run
441342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: command's stdout
442342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Return: command's status
443342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Note: the command's stderr is lost
444342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb_shell () {
445342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local TMPOUT="$(mktemp)"
446342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local LASTLINE RET
447342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local ADB=${ADB:-adb}
448342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
449342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # The weird sed rule is to strip the final \r on each output line
450342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Since 'adb shell' never returns the command's proper exit/status code,
451342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # we force it to print it as '%%<status>' in the temporary output file,
452342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # which we will later strip from it.
453342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  $ADB shell $@ ";" echo "%%\$?" 2>/dev/null | \
454342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      sed -e 's![[:cntrl:]]!!g' > $TMPOUT
455342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Get last line in log, which contains the exit code from the command
456342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  LASTLINE=$(sed -e '$!d' $TMPOUT)
457342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Extract the status code from the end of the line, which must
458342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # be '%%<code>'.
459342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  RET=$(echo "$LASTLINE" | \
460342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,RSTART+2); } }')
461342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Remove the status code from the last line. Note that this may result
462342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # in an empty line.
463342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  LASTLINE=$(echo "$LASTLINE" | \
464342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,1,RSTART-1); } }')
465342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # The output itself: all lines except the status code.
466342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  sed -e '$d' $TMPOUT && printf "%s" "$LASTLINE"
467342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Remove temp file.
468342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  rm -f $TMPOUT
469342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Exit with the appropriate status.
470342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  return $RET
471342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
472342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
473342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Find the target architecture from a local shared library.
474342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# This returns an NDK-compatible architecture name.
475342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# out: NDK Architecture name, or empty string.
476342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_gyp_target_arch () {
477342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local RANDOM_LIB=$(ls "$SYMBOL_DIR"/lib*.so | head -n1)
478342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local SO_DESC=$(file $RANDOM_LIB)
479342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  case $ARCH in
480342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *32-bit*ARM,*) echo "arm";;
481342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *64-bit*ARM,*) echo "arm64";;
482342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *32-bit*Intel,*) echo "x86";;
483342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *x86-64,*) echo "x86_64";;
484342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *32-bit*MIPS,*) echo "mips";;
485342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *) echo "";
486342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  esac
487342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
488342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
489342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$TARGET_ARCH" ]; then
490342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  TARGET_ARCH=$(get_gyp_target_arch)
491342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$TARGET_ARCH" ]; then
492342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    TARGET_ARCH=arm
493342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
494342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelse
495342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Nit: accept Chromium's 'ia32' as a valid target architecture. This
496342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # script prefers the NDK 'x86' name instead because it uses it to find
497342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # NDK-specific files (host gdb) with it.
498342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$TARGET_ARCH" = "ia32" ]; then
499342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    TARGET_ARCH=x86
500342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    log "Auto-config: --arch=$TARGET_ARCH  (equivalent to ia32)"
501342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
502342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
503342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
504342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Detect the NDK system name, i.e. the name used to identify the host.
505342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# out: NDK system name (e.g. 'linux' or 'darwin')
506342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_ndk_host_system () {
507342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local HOST_OS
508342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$NDK_HOST_SYSTEM" ]; then
509342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    HOST_OS=$(uname -s)
510342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    case $HOST_OS in
511342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      Linux) NDK_HOST_SYSTEM=linux;;
512342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      Darwin) NDK_HOST_SYSTEM=darwin;;
513342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      *) panic "You can't run this script on this system: $HOST_OS";;
514342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    esac
515342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
516342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "$NDK_HOST_SYSTEM"
517342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
518342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
519342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Detect the NDK host architecture name.
520342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# out: NDK arch name (e.g. 'x86' or 'x86_64')
521342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_ndk_host_arch () {
522342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local HOST_ARCH HOST_OS
523342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$NDK_HOST_ARCH" ]; then
524342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    HOST_OS=$(get_ndk_host_system)
525342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    HOST_ARCH=$(uname -p)
526342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    case $HOST_ARCH in
527342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      i?86) NDK_HOST_ARCH=x86;;
528342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      x86_64|amd64) NDK_HOST_ARCH=x86_64;;
529342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      *) panic "You can't run this script on this host architecture: $HOST_ARCH";;
530342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    esac
531342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    # Darwin trick: "uname -p" always returns i386 on 64-bit installations.
532342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$HOST_OS" = darwin -a "$NDK_HOST_ARCH" = "x86" ]; then
533342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      # Use '/usr/bin/file', not just 'file' to avoid buggy MacPorts
534342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      # implementations of the tool. See http://b.android.com/53769
535342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      HOST_64BITS=$(/usr/bin/file -L "$SHELL" | grep -e "x86[_-]64")
536342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      if [ "$HOST_64BITS" ]; then
537342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch        NDK_HOST_ARCH=x86_64
538342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      fi
539342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
540342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
541342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "$NDK_HOST_ARCH"
542342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
543342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
544342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Convert an NDK architecture name into a GNU configure triplet.
545342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: NDK architecture name (e.g. 'arm')
546342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: Android GNU configure triplet (e.g. 'arm-linux-androideabi')
547342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_arch_gnu_config () {
548342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  case $1 in
549342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    arm)
550342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "arm-linux-androideabi"
551342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
552342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    arm64)
553342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "aarch64-linux-android"
554342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
555342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    x86)
556342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "i686-linux-android"
557342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
558342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    x86_64)
559342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "x86_64-linux-android"
560342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
561342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    mips)
562342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "mipsel-linux-android"
563342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
564342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    *)
565342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "$ARCH-linux-android"
566342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      ;;
567342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  esac
568342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
569342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
570342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Convert an NDK architecture name into a toolchain name prefix
571342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: NDK architecture name (e.g. 'arm')
572342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: NDK toolchain name prefix (e.g. 'arm-linux-androideabi')
573342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_arch_toolchain_prefix () {
574342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Return the configure triplet, except for x86!
575342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$1" = "x86" ]; then
576342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "$1"
577342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  else
578342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    get_arch_gnu_config $1
579342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
580342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
581342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
582342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Find a NDK toolchain prebuilt file or sub-directory.
583342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# This will probe the various arch-specific toolchain directories
584342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# in the NDK for the needed file.
585342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: NDK install path
586342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $2: NDK architecture name
587342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $3: prebuilt sub-path to look for.
588342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: file path, or empty if none is found.
589342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_ndk_toolchain_prebuilt () {
590342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local NDK_DIR="${1%/}"
591342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local ARCH="$2"
592342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local SUBPATH="$3"
593342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local NAME="$(get_arch_toolchain_prefix $ARCH)"
594342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local FILE TARGET
595342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  FILE=$NDK_DIR/toolchains/$NAME-4.9/prebuilt/$SUBPATH
596342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ ! -f "$FILE" ]; then
597342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    FILE=$NDK_DIR/toolchains/$NAME-4.8/prebuilt/$SUBPATH
598342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ ! -f "$FILE" ]; then
599342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      FILE=
600342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
601342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
602342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "$FILE"
603342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
604342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
605342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Find the path to an NDK's toolchain full prefix for a given architecture
606342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: NDK install path
607342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $2: NDK target architecture name
608342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: install path + binary prefix (e.g.
609342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#      ".../path/to/bin/arm-linux-androideabi-")
610342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_ndk_toolchain_fullprefix () {
611342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local NDK_DIR="$1"
612342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local ARCH="$2"
613342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local TARGET NAME HOST_OS HOST_ARCH GCC CONFIG
614342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
615342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # NOTE: This will need to be updated if the NDK changes the names or moves
616342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  #        the location of its prebuilt toolchains.
617342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  #
618342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  GCC=
619342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  HOST_OS=$(get_ndk_host_system)
620342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  HOST_ARCH=$(get_ndk_host_arch)
621342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  CONFIG=$(get_arch_gnu_config $ARCH)
622342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  GCC=$(get_ndk_toolchain_prebuilt \
623342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch        "$NDK_DIR" "$ARCH" "$HOST_OS-$HOST_ARCH/bin/$CONFIG-gcc")
624342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$GCC" -a "$HOST_ARCH" = "x86_64" ]; then
625342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    GCC=$(get_ndk_toolchain_prebuilt \
626342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch          "$NDK_DIR" "$ARCH" "$HOST_OS-x86/bin/$CONFIG-gcc")
627342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
628342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ ! -f "$GCC" -a "$ARCH" = "x86" ]; then
629342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    # Special case, the x86 toolchain used to be incorrectly
630342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    # named i686-android-linux-gcc!
631342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    GCC=$(get_ndk_toolchain_prebuilt \
632342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch          "$NDK_DIR" "$ARCH" "$HOST_OS-x86/bin/i686-android-linux-gcc")
633342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
634342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$GCC" ]; then
635342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Cannot find Android NDK toolchain for '$ARCH' architecture. \
636342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPlease verify your NDK installation!"
637342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
638342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "${GCC%%gcc}"
639342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
640342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
641342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: NDK install path
642342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $2: target architecture.
643342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_ndk_gdbserver () {
644342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local NDK_DIR="$1"
645342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local ARCH=$2
646342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  local BINARY
647342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
648342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # The location has moved after NDK r8
649342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  BINARY=$NDK_DIR/prebuilt/android-$ARCH/gdbserver/gdbserver
650342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ ! -f "$BINARY" ]; then
651342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    BINARY=$(get_ndk_toolchain_prebuilt "$NDK_DIR" "$ARCH" gdbserver)
652342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
653342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "$BINARY"
654342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
655342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
656342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Check/probe the path to the Android toolchain installation. Always
657342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# use the NDK versions of gdb and gdbserver. They must match to avoid
658342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# issues when both binaries do not speak the same wire protocol.
659342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
660342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$TOOLCHAIN" ]; then
661342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ANDROID_TOOLCHAIN=$(get_ndk_toolchain_fullprefix \
662342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                      "$ANDROID_NDK_ROOT" "$TARGET_ARCH")
663342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ANDROID_TOOLCHAIN=$(dirname "$ANDROID_TOOLCHAIN")
664342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Auto-config: --toolchain=$ANDROID_TOOLCHAIN"
665342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelse
666342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Be flexible, allow one to specify either the install path or the bin
667342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # sub-directory in --toolchain:
668342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  #
669342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -d "$TOOLCHAIN/bin" ]; then
670342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    TOOLCHAIN=$TOOLCHAIN/bin
671342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
672342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ANDROID_TOOLCHAIN=$TOOLCHAIN
673342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
674342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
675342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Cosmetic: Remove trailing directory separator.
676342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN%/}
677342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
678342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Find host GDB client binary
679342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$GDB" ]; then
680342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  GDB=$(which $ANDROID_TOOLCHAIN/*-$GDBEXEPOSTFIX 2>/dev/null | head -1)
681342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$GDB" ]; then
682342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Can't find Android gdb client in your path, check your \
683342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch--toolchain or --gdb path."
684342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
685342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Host gdb client: $GDB"
686342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
687342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
688342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Find gdbserver binary, we will later push it to /data/local/tmp
689342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# This ensures that both gdbserver and $GDB talk the same binary protocol,
690342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# otherwise weird problems will appear.
691342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
692342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$GDBSERVER" ]; then
693342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  GDBSERVER=$(get_ndk_gdbserver "$ANDROID_NDK_ROOT" "$TARGET_ARCH")
694342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$GDBSERVER" ]; then
695342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    panic "Can't find NDK gdbserver binary. use --gdbserver to specify \
696342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochvalid one!"
697342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
698342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Auto-config: --gdbserver=$GDBSERVER"
699342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
700342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
701342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# A unique ID for this script's session. This needs to be the same in all
702342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# sub-shell commands we're going to launch, so take the PID of the launcher
703342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# process.
704342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTMP_ID=$$
705342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
706342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Temporary directory, will get cleaned up on exit.
707342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTMPDIR=/tmp/$USER-adb-gdb-tmp-$TMP_ID
708342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochmkdir -p "$TMPDIR" && rm -rf "$TMPDIR"/*
709342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
710342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBSERVER_PIDFILE="$TMPDIR"/gdbserver-$TMP_ID.pid
711342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
712342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If --force is specified, try to kill any gdbserver process started by the
713342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# same user on the device. Normally, these are killed automatically by the
714342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# script on exit, but there are a few corner cases where this would still
715342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# be needed.
716342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$FORCE" ]; then
717342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  GDBSERVER_PIDS=$(adb_shell ps | awk '$9 ~ /gdbserver/ { print $2; }')
718342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  for GDB_PID in $GDBSERVER_PIDS; do
719342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    log "Killing previous gdbserver (PID=$GDB_PID)"
720342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    adb_shell kill -9 $GDB_PID
721342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  done
722342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
723342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
724342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$START" ]; then
725342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Starting $PROGRAM_NAME on device."
726342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  adb_shell am start -n $PACKAGE_NAME/$ACTIVITY ${START_URL:+-d "$START_URL"}
727342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  adb_shell ps | grep -q $PACKAGE_NAME
728342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fail_panic "Could not start $PROGRAM_NAME on device. Are you sure the \
729342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochpackage is installed?"
730342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
731342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
732342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Return the timestamp of a given file, as number of seconds since epoch.
733342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: file path
734342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Out: file timestamp
735342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_file_timestamp () {
736342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  stat -c %Y "$1" 2>/dev/null
737342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
738342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
739342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Allow several concurrent debugging sessions
740342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTARGET_GDBSERVER=/data/data/$PACKAGE_NAME/gdbserver-adb-gdb-$TMP_ID
741342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTMP_TARGET_GDBSERVER=/data/local/tmp/gdbserver-adb-gdb-$TMP_ID
742342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
743342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Return the build fingerprint contained in a build.prop file.
744342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# $1: path to build.prop file
745342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochget_build_fingerprint_from () {
746342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  cat "$1" | grep -e '^ro.build.fingerprint=' | cut -d= -f2
747342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch}
748342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
749342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
750342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochORG_PULL_LIBS_DIR=$PULL_LIBS_DIR
751342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochPULL_LIBS_DIR=${PULL_LIBS_DIR:-$DEFAULT_PULL_LIBS_DIR}
752342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
753342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochHOST_FINGERPRINT=
754342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochDEVICE_FINGERPRINT=$(adb_shell getprop ro.build.fingerprint)
755342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch[[ "$DEVICE_FINGERPRINT" ]] || panic "Failed to get the device fingerprint"
756342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Device build fingerprint: $DEVICE_FINGERPRINT"
757342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
758342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If --pull-libs-dir is not specified, and this is a platform build, look
759342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# if we can use the symbolic libraries under $ANDROID_PRODUCT_OUT/symbols/
760342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# directly, if the build fingerprint matches the device.
761342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$ORG_PULL_LIBS_DIR" -a \
762342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch     "$ANDROID_PRODUCT_OUT" -a \
763342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch     -f "$ANDROID_PRODUCT_OUT/system/build.prop" ]; then
764342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  ANDROID_FINGERPRINT=$(get_build_fingerprint_from \
765342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch                        "$ANDROID_PRODUCT_OUT"/system/build.prop)
766342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Android build fingerprint:  $ANDROID_FINGERPRINT"
767342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$ANDROID_FINGERPRINT" = "$DEVICE_FINGERPRINT" ]; then
768342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    log "Perfect match!"
769342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PULL_LIBS_DIR=$ANDROID_PRODUCT_OUT/symbols
770342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    HOST_FINGERPRINT=$ANDROID_FINGERPRINT
771342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$PULL_LIBS" ]; then
772342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      log "Ignoring --pull-libs since the device and platform build \
773342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfingerprints match."
774342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      NO_PULL_LIBS=true
775342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
776342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
777342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
778342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
779342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If neither --pull-libs an --no-pull-libs were specified, check the build
780342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# fingerprints of the device, and the cached system libraries on the host.
781342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
782342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$NO_PULL_LIBS" -a -z "$PULL_LIBS" ]; then
783342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ ! -f "$PULL_LIBS_DIR/build.fingerprint" ]; then
784342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    log "Auto-config: --pull-libs  (no cached libraries)"
785342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PULL_LIBS=true
786342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  else
787342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    HOST_FINGERPRINT=$(< "$PULL_LIBS_DIR/build.fingerprint")
788342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    log "Host build fingerprint:   $HOST_FINGERPRINT"
789342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$HOST_FINGERPRINT" == "$DEVICE_FINGERPRINT" ]; then
790342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      log "Auto-config: --no-pull-libs (fingerprint match)"
791342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      NO_PULL_LIBS=true
792342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    else
793342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      log "Auto-config: --pull-libs  (fingerprint mismatch)"
794342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      PULL_LIBS=true
795342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
796342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
797342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
798342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
799342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Extract the system libraries from the device if necessary.
800342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then
801342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "Extracting system libraries into: $PULL_LIBS_DIR"
802342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
803342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
804342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochmkdir -p "$PULL_LIBS_DIR"
805342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfail_panic "Can't create --libs-dir directory: $PULL_LIBS_DIR"
806342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
807342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If requested, work for M-x gdb.  The gdb indirections make it
808342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# difficult to pass --annotate=3 to the gdb binary itself.
809342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDB_ARGS=
810342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$ANNOTATE" ]; then
811342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  GDB_ARGS=$GDB_ARGS" --annotate=$ANNOTATE"
812342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
813342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
814342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Get the PID from the first argument or else find the PID of the
815342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# browser process.
816342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$PID" ]; then
817342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  PROCESSNAME=$PACKAGE_NAME
818342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$SANDBOXED_INDEX" ]; then
819342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PROCESSNAME=$PROCESSNAME:sandboxed_process$SANDBOXED_INDEX
820342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  elif [ "$SANDBOXED" ]; then
821342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PROCESSNAME=$PROCESSNAME:sandboxed_process
822342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PID=$(adb_shell ps | \
823342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch          awk '$9 ~ /^'$PROCESSNAME'/ { print $2; }' | head -1)
824342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  elif [ "$PRIVILEGED_INDEX" ]; then
825342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PROCESSNAME=$PROCESSNAME:privileged_process$PRIVILEGED_INDEX
826342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  elif [ "$PRIVILEGED" ]; then
827342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PROCESSNAME=$PROCESSNAME:privileged_process
828342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PID=$(adb_shell ps | \
829342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch          awk '$9 ~ /^'$PROCESSNAME'/ { print $2; }' | head -1)
830342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
831342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$PID" ]; then
832342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PID=$(adb_shell ps | \
833342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch          awk '$9 == "'$PROCESSNAME'" { print $2; }' | head -1)
834342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
835342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ -z "$PID" ]; then
836342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$START" ]; then
837342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      panic "Can't find application process PID, did it crash?"
838342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    else
839342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      panic "Can't find application process PID, are you sure it is \
840342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochrunning? Try using --start."
841342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
842342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
843342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Found process PID: $PID"
844342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelif [ "$SANDBOXED" ]; then
845342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "WARNING: --sandboxed option ignored due to use of --pid."
846342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelif [ "$PRIVILEGED" ]; then
847342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "WARNING: --privileged option ignored due to use of --pid."
848342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
849342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
850342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Determine if 'adb shell' runs as root or not.
851342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If so, we can launch gdbserver directly, otherwise, we have to
852342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# use run-as $PACKAGE_NAME ..., which requires the package to be debuggable.
853342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
854342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$SU_PREFIX" ]; then
855342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Need to check that this works properly.
856342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  SU_PREFIX_TEST_LOG=$TMPDIR/su-prefix.log
857342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  adb_shell $SU_PREFIX \"echo "foo"\" > $SU_PREFIX_TEST_LOG 2>&1
858342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ $? != 0 -o "$(cat $SU_PREFIX_TEST_LOG)" != "foo" ]; then
859342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "ERROR: Cannot use '$SU_PREFIX' as a valid su prefix:"
860342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "$ adb shell $SU_PREFIX \"echo foo\""
861342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    cat $SU_PREFIX_TEST_LOG
862342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    exit 1
863342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
864342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  COMMAND_PREFIX="$SU_PREFIX \""
865342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  COMMAND_SUFFIX="\""
866342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochelse
867342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  SHELL_UID=$(adb shell cat /proc/self/status | \
868342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch              awk '$1 == "Uid:" { print $2; }')
869342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  log "Shell UID: $SHELL_UID"
870342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ "$SHELL_UID" != 0 -o -n "$NO_ROOT" ]; then
871342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    COMMAND_PREFIX="run-as $PACKAGE_NAME"
872342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    COMMAND_SUFFIX=
873342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  else
874342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    COMMAND_PREFIX=
875342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    COMMAND_SUFFIX=
876342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
877342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
878342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Command prefix: '$COMMAND_PREFIX'"
879342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Command suffix: '$COMMAND_SUFFIX'"
880342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
881342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Pull device's system libraries that are mapped by our process.
882342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Pulling all system libraries is too long, so determine which ones
883342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# we need by looking at /proc/$PID/maps instead
884342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then
885342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "Extracting system libraries into: $PULL_LIBS_DIR"
886342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  MAPPINGS=$(adb_shell $COMMAND_PREFIX cat /proc/$PID/maps $COMMAND_SUFFIX)
887342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ $? != 0 ]; then
888342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "ERROR: Could not list process's memory mappings."
889342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ "$SU_PREFIX" ]; then
890342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      panic "Are you sure your --su-prefix is correct?"
891342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    else
892342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      panic "Use --su-prefix if the application is not debuggable."
893342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
894342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
895342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  # Remove the fingerprint file in case pulling one of the libs fails.
896342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  rm -f "$PULL_LIBS_DIR/build.fingerprint"
897342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  SYSTEM_LIBS=$(echo "$MAPPINGS" | \
898342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      awk '$6 ~ /\/system\/.*\.so$/ { print $6; }' | sort -u)
899342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  for SYSLIB in /system/bin/linker $SYSTEM_LIBS; do
900342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "Pulling from device: $SYSLIB"
901342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    DST_FILE=$PULL_LIBS_DIR$SYSLIB
902342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    DST_DIR=$(dirname "$DST_FILE")
903342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    mkdir -p "$DST_DIR" && adb pull $SYSLIB "$DST_FILE" 2>/dev/null
904342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fail_panic "Could not pull $SYSLIB from device !?"
905342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  done
906342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "Writing the device fingerprint"
907342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "$DEVICE_FINGERPRINT" > "$PULL_LIBS_DIR/build.fingerprint"
908342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
909342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
910342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Find all the sub-directories of $PULL_LIBS_DIR, up to depth 4
911342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# so we can add them to solib-search-path later.
912342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSOLIB_DIRS=$(find $PULL_LIBS_DIR -mindepth 1 -maxdepth 4 -type d | \
913342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch             grep -v "^$" | tr '\n' ':')
914342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
915342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# This is a re-implementation of gdbclient, where we use compatible
916342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# versions of gdbserver and $GDBNAME to ensure that everything works
917342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# properly.
918342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
919342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
920342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Push gdbserver to the device
921342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Pushing gdbserver $GDBSERVER to $TARGET_GDBSERVER"
922342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb push $GDBSERVER $TMP_TARGET_GDBSERVER &>/dev/null
923342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb shell $COMMAND_PREFIX cp $TMP_TARGET_GDBSERVER $TARGET_GDBSERVER
924342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb shell rm $TMP_TARGET_GDBSERVER
925342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfail_panic "Could not copy gdbserver to the device!"
926342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
927342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ -z "$PORT" ]; then
928342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    PORT=5039
929342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
930342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochHOST_PORT=$PORT
931342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTARGET_PORT=$PORT
932342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
933342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Select correct app_process for architecture.
934342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochcase $TARGET_ARCH in
935342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      arm|x86|mips) GDBEXEC=app_process32;;
936342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      arm64|x86_64) GDBEXEC=app_process64;;
937342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      *) fail_panic "Unknown app_process for architecture!";;
938342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochesac
939342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
940342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Default to app_process if bit-width specific process isn't found.
941342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb_shell ls /system/bin/$GDBEXEC
942342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ $? != 0 ]; then
943342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    GDBEXEC=app_process
944342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
945342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
946342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Detect AddressSanitizer setup on the device. In that case app_process is a
947342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# script, and the real executable is app_process.real.
948342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBEXEC_ASAN=app_process.real
949342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb_shell ls /system/bin/$GDBEXEC_ASAN
950342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ $? == 0 ]; then
951342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    GDBEXEC=$GDBEXEC_ASAN
952342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
953342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
954342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Pull the app_process binary from the device.
955342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Pulling $GDBEXEC from device"
956342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb pull /system/bin/$GDBEXEC "$TMPDIR"/$GDBEXEC &>/dev/null
957342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfail_panic "Could not retrieve $GDBEXEC from the device!"
958342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
959342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Setup network redirection
960342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Setting network redirection (host:$HOST_PORT -> device:$TARGET_PORT)"
961342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochadb forward tcp:$HOST_PORT tcp:$TARGET_PORT
962342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfail_panic "Could not setup network redirection from \
963342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochhost:localhost:$HOST_PORT to device:localhost:$TARGET_PORT!"
964342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
965342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Start gdbserver in the background
966342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Note that using run-as requires the package to be debuggable.
967342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
968342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# If not, this will fail horribly. The alternative is to run the
969342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# program as root, which requires of course root privileges.
970342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Maybe we should add a --root option to enable this?
971342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#
972342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Starting gdbserver in the background:"
973342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBSERVER_LOG=$TMPDIR/gdbserver-$TMP_ID.log
974342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "adb shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \
975342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --attach $PID $COMMAND_SUFFIX"
976342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch"$ADB" shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \
977342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  --attach $PID $COMMAND_SUFFIX > $GDBSERVER_LOG 2>&1 &
978342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochGDBSERVER_PID=$!
979342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "$GDBSERVER_PID" > $GDBSERVER_PIDFILE
980342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "background job pid: $GDBSERVER_PID"
981342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
982342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Sleep to allow gdbserver to attach to the remote process and be
983342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# ready to connect to.
984342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Sleeping ${ATTACH_DELAY}s to allow gdbserver to attach."
985342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochsleep "$ATTACH_DELAY"
986342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Job control: $(jobs -l)"
987342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochSTATE=$(jobs -l | awk '$2 == "'$GDBSERVER_PID'" { print $3; }')
988342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$STATE" != "Running" ]; then
989342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "ERROR: GDBServer either failed to run or attach to PID $PID!"
990342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  if [ $(adb_shell su -c getenforce) != "Permissive" ];  then
991342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "Device mode is Enforcing. Changing Device mode to Permissive "
992342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    $(adb_shell su -c setenforce 0)
993342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    if [ $(adb_shell su -c getenforce) != "Permissive" ]; then
994342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "ERROR: Failed to Change Device mode to Permissive"
995342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      echo "Failure log (use --verbose for more information):"
996342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      cat $GDBSERVER_LOG
997342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch      exit 1
998342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    fi
999342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  else
1000342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    echo "Failure log (use --verbose for more information):"
1001342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    cat $GDBSERVER_LOG
1002342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    exit 1
1003342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  fi
1004342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
1005342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
1006342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Generate a file containing useful GDB initialization commands
1007342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochreadonly COMMANDS=$TMPDIR/gdb.init
1008342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Generating GDB initialization commands file: $COMMANDS"
1009342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho -n "" > $COMMANDS
1010342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "set print pretty 1" >> $COMMANDS
1011342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "python" >> $COMMANDS
1012342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "import sys" >> $COMMANDS
1013342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "sys.path.insert(0, '$CHROMIUM_SRC/tools/gdb/')" >> $COMMANDS
1014342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "try:" >> $COMMANDS
1015342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "  import gdb_chrome" >> $COMMANDS
1016342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "finally:" >> $COMMANDS
1017342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "  sys.path.pop(0)" >> $COMMANDS
1018342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "end" >> $COMMANDS
1019342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "file $TMPDIR/$GDBEXEC" >> $COMMANDS
1020342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "directory $CHROMIUM_SRC" >> $COMMANDS
1021342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "set solib-absolute-prefix $PULL_LIBS_DIR" >> $COMMANDS
1022342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "set solib-search-path $SOLIB_DIRS:$PULL_LIBS_DIR:$SYMBOL_DIR" \
1023342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    >> $COMMANDS
1024342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "echo Attaching and reading symbols, this may take a while.." \
1025342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch    >> $COMMANDS
1026342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochecho "target remote :$HOST_PORT" >> $COMMANDS
1027342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
1028342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$GDBINIT" ]; then
1029342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  cat "$GDBINIT" >> $COMMANDS
1030342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
1031342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
1032342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif [ "$VERBOSE" -gt 0 ]; then
1033342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "### START $COMMANDS"
1034342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  cat $COMMANDS
1035342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch  echo "### END $COMMANDS"
1036342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochfi
1037342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch
1038342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochlog "Launching gdb client: $GDB $GDB_ARGS -x $COMMANDS"
1039342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch$GDB $GDB_ARGS -x $COMMANDS &&
1040342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochrm -f "$GDBSERVER_PIDFILE"
1041