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