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