15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/bin/bash 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A generic script used to attach to a running Chromium process and 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# debug it. Most users should not use this directly, but one of the 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)# wrapper scripts like adb_gdb_content_shell 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use --help to print full usage instructions. 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROGNAME=$(basename "$0") 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROGDIR=$(dirname "$0") 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Location of Chromium-top-level sources. 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)CHROMIUM_SRC=$(cd "$PROGDIR"/../.. >/dev/null && pwd 2>/dev/null) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# Location of Chromium out/ directory. 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)if [ -z "$CHROMIUM_OUT_DIR" ]; then 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHROMIUM_OUT_DIR=out 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)fi 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMPDIR= 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_PIDFILE= 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET_GDBSERVER= 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)clean_exit () { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$TMPDIR" ]; then 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBSERVER_PID=$(cat $GDBSERVER_PIDFILE 2>/dev/null) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$GDBSERVER_PID" ]; then 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Killing background gdbserver process: $GDBSERVER_PID" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill -9 $GDBSERVER_PID >/dev/null 2>&1 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$TARGET_GDBSERVER" ]; then 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Removing target gdbserver binary: $TARGET_GDBSERVER." 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$ADB" shell rm "$TARGET_GDBSERVER" >/dev/null 2>&1 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Cleaning up: $TMPDIR" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rm -rf "$TMPDIR" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) trap "" EXIT 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit $1 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)# Ensure clean exit on Ctrl-C or normal exit. 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)trap "clean_exit 1" INT HUP QUIT TERM 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)trap "clean_exit \$?" EXIT 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)panic () { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "ERROR: $@" >&2 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) exit 1 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic () { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ $? != 0 ]; then panic "$@"; fi 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log () { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$VERBOSE" -gt 0 ]; then 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$@" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFAULT_PULL_LIBS_DIR=/tmp/$USER-adb-gdb-libs 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# NOTE: Allow wrapper scripts to set various default through ADB_GDB_XXX 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# environment variables. This is only for cosmetic reasons, i.e. to 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# display proper 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Allow wrapper scripts to set the default activity through 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the ADB_GDB_ACTIVITY variable. Users are still able to change the 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# final activity name through --activity=<name> option. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This is only for cosmetic reasons, i.e. to display the proper default 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the --help output. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFAULT_ACTIVITY=${ADB_GDB_ACTIVITY:-".Main"} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Allow wrapper scripts to set the program name through ADB_GDB_PROGNAME 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROGNAME=${ADB_GDB_PROGNAME:-$(basename "$0")} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTIVITY=$DEFAULT_ACTIVITY 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ADB= 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ANNOTATE= 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Note: Ignore BUILDTYPE variable, because the Ninja build doesn't use it. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BUILDTYPE= 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FORCE= 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)GDBEXEPOSTFIX=gdb 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBINIT= 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER= 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HELP= 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NDK_DIR= 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NO_PULL_LIBS= 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PACKAGE_NAME= 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PID= 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PROGRAM_NAME="activity" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PULL_LIBS= 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PULL_LIBS_DIR= 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SANDBOXED= 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SANDBOXED_INDEX= 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)START= 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)SU_PREFIX= 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYMBOL_DIR= 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET_ARCH= 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TOOLCHAIN= 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)VERBOSE=0 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)for opt; do 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)') 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case $opt in 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --adb=*) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADB=$optarg 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --activity=*) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ACTIVITY=$optarg 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --annotate=3) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE=$optarg 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --force) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FORCE=true 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --gdbserver=*) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBSERVER=$optarg 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) --gdb=*) 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GDB=$optarg 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ;; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --help|-h|-?) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HELP=true 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --ndk-dir=*) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NDK_DIR=$optarg 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --no-pull-libs) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_PULL_LIBS=true 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --package-name=*) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PACKAGE_NAME=$optarg 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --pid=*) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PID=$optarg 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --program-name=*) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROGRAM_NAME=$optarg 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --pull-libs) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS=true 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --pull-libs-dir=*) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS_DIR=$optarg 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --sandboxed) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SANDBOXED=true 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --sandboxed=*) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SANDBOXED=true 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SANDBOXED_INDEX=$optarg 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --script=*) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBINIT=$optarg 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --start) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) START=true 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) --su-prefix=*) 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SU_PREFIX=$optarg 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ;; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --symbol-dir=*) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SYMBOL_DIR=$optarg 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) --out-dir=*) 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHROMIUM_OUT_DIR=$optarg 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ;; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --target-arch=*) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TARGET_ARCH=$optarg 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --toolchain=*) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOOLCHAIN=$optarg 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) --ui) 185868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GDBEXEPOSTFIX=gdbtui 186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ;; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --verbose) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VERBOSE=$(( $VERBOSE + 1 )) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --debug) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BUILDTYPE=Debug 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --release) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BUILDTYPE=Release 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -*) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Unknown option $OPT, see --help." >&2 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$PACKAGE_NAME" ]; then 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "You can only provide a single package name as argument!\ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) See --help." 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PACKAGE_NAME=$opt 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) esac 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)print_help_options () { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat <<EOF 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$HELP" ]; then 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$ADB_GDB_PROGNAME" ]; then 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assume wrapper scripts all provide a default package name. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat <<EOF 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Usage: $PROGNAME [options] 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Attach gdb to a running Android $PROGRAM_NAME process. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Assume this is a direct call to adb_gdb 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat <<EOF 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Usage: $PROGNAME [options] [<package-name>] 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Attach gdb to a running Android $PROGRAM_NAME process. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)If provided, <package-name> must be the name of the Android application's 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package name to be debugged. You can also use --package-name=<name> to 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)specify it. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat <<EOF 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This script is used to debug a running $PROGRAM_NAME process. 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This can be a regular Android application process, or a sandboxed 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)service, if you use the --sandboxed or --sandboxed=<num> option. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This script needs several things to work properly. It will try to pick 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)them up automatically for you though: 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) - target gdbserver binary 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) - host gdb client (e.g. arm-linux-androideabi-gdb) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) - directory with symbolic version of $PROGRAM_NAME's shared libraries. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochYou can also use --ndk-dir=<path> to specify an alternative NDK installation 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)directory. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The script tries to find the most recent version of the debug version of 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)shared libraries under one of the following directories: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) \$CHROMIUM_SRC/<out>/Release/lib/ (used by Ninja builds) 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) \$CHROMIUM_SRC/<out>/Debug/lib/ (used by Ninja builds) 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) \$CHROMIUM_SRC/<out>/Release/lib.target/ (used by Make builds) 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) \$CHROMIUM_SRC/<out>/Debug/lib.target/ (used by Make builds) 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)Where <out> is 'out' by default, unless the --out=<name> option is used or 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)the CHROMIUM_OUT_DIR environment variable is defined. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You can restrict this search by using --release or --debug to specify the 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)build type, or simply use --symbol-dir=<path> to specify the file manually. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The script tries to extract the target architecture from your GYP_DEFINES, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)but if this fails, will default to 'arm'. Use --target-arch=<name> to force 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)its value. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Otherwise, the script will complain, but you can use the --gdbserver, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--gdb and --symbol-lib options to specify everything manually. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)An alternative to --gdb=<file> is to use --toollchain=<path> to specify 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)the path to the host target-specific cross-toolchain. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)You will also need the 'adb' tool in your path. Otherwise, use the --adb 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)option. The script will complain if there is more than one device connected 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and ANDROID_SERIAL is not defined. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The first time you use it on a device, the script will pull many system 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)libraries required by the process into a temporary directory. This 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)is done to strongly improve the debugging experience, like allowing 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)readable thread stacks and more. The libraries are copied to the following 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)directory by default: 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $DEFAULT_PULL_LIBS_DIR/ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)But you can use the --pull-libs-dir=<path> option to specify an 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)alternative. The script can detect when you change the connected device, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)and will re-pull the libraries only in this case. You can however force it 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)with the --pull-libs option. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Any local .gdbinit script will be ignored, but it is possible to pass a 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gdb command script with the --script=<file> option. Note that its commands 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)will be passed to gdb after the remote connection and library symbol 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)loading have completed. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Valid options: 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --help|-h|-? Print this message. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --verbose Increase verbosity. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --sandboxed Debug first sandboxed process we find. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --sandboxed=<num> Debug specific sandboxed process. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --symbol-dir=<path> Specify directory with symbol shared libraries. 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) --out-dir=<path> Specify the out directory. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --package-name=<name> Specify package name (alternative to 1st argument). 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --program-name=<name> Specify program name (cosmetic only). 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --pid=<pid> Specify application process pid. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --force Kill any previous debugging session, if any. 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --start Start package's activity on device. 310868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) --ui Use gdbtui instead of gdb 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --activity=<name> Activity name for --start [$DEFAULT_ACTIVITY]. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --annotate=<num> Enable gdb annotation. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --script=<file> Specify extra GDB init script. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) --gdbserver=<file> Specify target gdbserver binary. 3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) --gdb=<file> Specify host gdb client binary. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --target-arch=<name> Specify NDK target arch. 3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) --adb=<file> Specify host ADB binary. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) --su-prefix=<prefix> Prepend <prefix> to 'adb shell' commands that are 3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) run by this script. This can be useful to use 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) the 'su' program on rooted production devices. 32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) e.g. --su-prefix="su -c" 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --pull-libs Force system libraries extraction. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --no-pull-libs Do not extract any system library. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --libs-dir=<path> Specify system libraries extraction directory. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --debug Use libraries under out/Debug. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --release Use libraries under out/Release. 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit 0 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$PACKAGE_NAME" ]; then 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Please specify a package name on the command line. See --help." 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$NDK_DIR" ]; then 341c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ANDROID_NDK_ROOT=$(PYTHONPATH=build/android python -c \ 342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch'from pylib.constants import ANDROID_NDK_ROOT; print ANDROID_NDK_ROOT,') 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -d "$NDK_DIR" ]; then 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Invalid directory: $NDK_DIR" 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$NDK_DIR/ndk-build" ]; then 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Not a valid NDK directory: $NDK_DIR" 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANDROID_NDK_ROOT=$NDK_DIR 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$GDBINIT" -a ! -f "$GDBINIT" ]; then 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Unknown --script file: $GDBINIT" 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find the target architecture from our $GYP_DEFINES 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This returns an NDK-compatible architecture name. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# out: NDK Architecture name, or empty string. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_gyp_target_arch () { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ARCH=$(echo $GYP_DEFINES | tr ' ' '\n' | grep '^target_arch=' |\ 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cut -d= -f2) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case $ARCH in 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia32|i?86|x86) echo "x86";; 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mips|arm|arm64|x86_64) echo "$ARCH";; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *) echo ""; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) esac 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$TARGET_ARCH" ]; then 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TARGET_ARCH=$(get_gyp_target_arch) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$TARGET_ARCH" ]; then 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TARGET_ARCH=arm 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Nit: accept Chromium's 'ia32' as a valid target architecture. This 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # script prefers the NDK 'x86' name instead because it uses it to find 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # NDK-specific files (host gdb) with it. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$TARGET_ARCH" = "ia32" ]; then 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TARGET_ARCH=x86 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --arch=$TARGET_ARCH (equivalent to ia32)" 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Detect the NDK system name, i.e. the name used to identify the host. 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# out: NDK system name (e.g. 'linux' or 'darwin') 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)get_ndk_host_system () { 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local HOST_OS 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ -z "$NDK_HOST_SYSTEM" ]; then 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_OS=$(uname -s) 39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case $HOST_OS in 39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Linux) NDK_HOST_SYSTEM=linux;; 39390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Darwin) NDK_HOST_SYSTEM=darwin;; 39490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *) panic "You can't run this script on this system: $HOST_OS";; 39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) esac 39690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) echo "$NDK_HOST_SYSTEM" 39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Detect the NDK host architecture name. 40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# out: NDK arch name (e.g. 'x86' or 'x86_64') 40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)get_ndk_host_arch () { 40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local HOST_ARCH HOST_OS 40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ -z "$NDK_HOST_ARCH" ]; then 40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_OS=$(get_ndk_host_system) 40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_ARCH=$(uname -p) 40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case $HOST_ARCH in 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) i?86) NDK_HOST_ARCH=x86;; 40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) x86_64|amd64) NDK_HOST_ARCH=x86_64;; 41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) *) panic "You can't run this script on this host architecture: $HOST_ARCH";; 41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) esac 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # Darwin trick: "uname -p" always returns i386 on 64-bit installations. 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ "$HOST_OS" = darwin -a "$NDK_HOST_ARCH" = "x86" ]; then 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # Use '/usr/bin/file', not just 'file' to avoid buggy MacPorts 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # implementations of the tool. See http://b.android.com/53769 41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_64BITS=$(/usr/bin/file -L "$SHELL" | grep -e "x86[_-]64") 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ "$HOST_64BITS" ]; then 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) NDK_HOST_ARCH=x86_64 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) echo "$NDK_HOST_ARCH" 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Convert an NDK architecture name into a GNU configure triplet. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: NDK architecture name (e.g. 'arm') 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: Android GNU configure triplet (e.g. 'arm-linux-androideabi') 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_arch_gnu_config () { 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case $1 in 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) arm) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "arm-linux-androideabi" 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arm64) 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) echo "aarch64-linux-android" 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ;; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x86) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "i686-linux-android" 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) x86_64) 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) echo "x86_64-linux-android" 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ;; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mips) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "mipsel-linux-android" 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$ARCH-linux-android" 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ;; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) esac 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Convert an NDK architecture name into a toolchain name prefix 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: NDK architecture name (e.g. 'arm') 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: NDK toolchain name prefix (e.g. 'arm-linux-androideabi') 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_arch_toolchain_prefix () { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Return the configure triplet, except for x86! 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$1" = "x86" ]; then 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$1" 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_arch_gnu_config $1 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find a NDK toolchain prebuilt file or sub-directory. 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This will probe the various arch-specific toolchain directories 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# in the NDK for the needed file. 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: NDK install path 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $2: NDK architecture name 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $3: prebuilt sub-path to look for. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: file path, or empty if none is found. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_ndk_toolchain_prebuilt () { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local NDK_DIR="${1%/}" 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ARCH="$2" 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local SUBPATH="$3" 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local NAME="$(get_arch_toolchain_prefix $ARCH)" 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local FILE TARGET 476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FILE=$NDK_DIR/toolchains/$NAME-4.8/prebuilt/$SUBPATH 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$FILE" ]; then 478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FILE=$NDK_DIR/toolchains/$NAME-4.9/prebuilt/$SUBPATH 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$FILE" ]; then 480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FILE=$NDK_DIR/toolchains/$NAME-4.6/prebuilt/$SUBPATH 481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if [ ! -f "$FILE" ]; then 482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FILE= 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fi 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$FILE" 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Find the path to an NDK's toolchain full prefix for a given architecture 49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# $1: NDK install path 49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# $2: NDK target architecture name 49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Out: install path + binary prefix (e.g. 49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# ".../path/to/bin/arm-linux-androideabi-") 49490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)get_ndk_toolchain_fullprefix () { 49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local NDK_DIR="$1" 49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local ARCH="$2" 49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local TARGET NAME HOST_OS HOST_ARCH GCC CONFIG 49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 49990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # NOTE: This will need to be updated if the NDK changes the names or moves 50090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # the location of its prebuilt toolchains. 50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC= 50390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_OS=$(get_ndk_host_system) 50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_ARCH=$(get_ndk_host_arch) 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CONFIG=$(get_arch_gnu_config $ARCH) 50690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC=$(get_ndk_toolchain_prebuilt \ 50790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$NDK_DIR" "$ARCH" "$HOST_OS-$HOST_ARCH/bin/$CONFIG-gcc") 50890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ -z "$GCC" -a "$HOST_ARCH" = "x86_64" ]; then 50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC=$(get_ndk_toolchain_prebuilt \ 51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$NDK_DIR" "$ARCH" "$HOST_OS-x86/bin/$CONFIG-gcc") 51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ ! -f "$GCC" -a "$ARCH" = "x86" ]; then 51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # Special case, the x86 toolchain used to be incorrectly 51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # named i686-android-linux-gcc! 51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC=$(get_ndk_toolchain_prebuilt \ 51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$NDK_DIR" "$ARCH" "$HOST_OS-x86/bin/i686-android-linux-gcc") 51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ -z "$GCC" ]; then 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) panic "Cannot find Android NDK toolchain for '$ARCH' architecture. \ 52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Please verify your NDK installation!" 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) echo "${GCC%%gcc}" 52390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: NDK install path 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $2: target architecture. 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_ndk_gdbserver () { 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local NDK_DIR="$1" 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ARCH=$2 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local BINARY 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The location has moved after NDK r8 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BINARY=$NDK_DIR/prebuilt/android-$ARCH/gdbserver/gdbserver 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$BINARY" ]; then 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BINARY=$(get_ndk_toolchain_prebuilt "$NDK_DIR" "$ARCH" gdbserver) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$BINARY" 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check/probe the path to the Android toolchain installation. Always 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# use the NDK versions of gdb and gdbserver. They must match to avoid 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# issues when both binaries do not speak the same wire protocol. 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$TOOLCHAIN" ]; then 54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ANDROID_TOOLCHAIN=$(get_ndk_toolchain_fullprefix \ 54690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$ANDROID_NDK_ROOT" "$TARGET_ARCH") 54790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ANDROID_TOOLCHAIN=$(dirname "$ANDROID_TOOLCHAIN") 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --toolchain=$ANDROID_TOOLCHAIN" 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Be flexible, allow one to specify either the install path or the bin 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # sub-directory in --toolchain: 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -d "$TOOLCHAIN/bin" ]; then 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOOLCHAIN=$TOOLCHAIN/bin 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANDROID_TOOLCHAIN=$TOOLCHAIN 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Cosmetic: Remove trailing directory separator. 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN%/} 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find host GDB client binary 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$GDB" ]; then 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GDB=$(which $ANDROID_TOOLCHAIN/*-$GDBEXEPOSTFIX 2>/dev/null | head -1) 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if [ -z "$GDB" ]; then 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) panic "Can't find Android gdb client in your path, check your \ 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)--toolchain or --gdb path." 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fi 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) log "Host gdb client: $GDB" 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find gdbserver binary, we will later push it to /data/local/tmp 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This ensures that both gdbserver and $GDB talk the same binary protocol, 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# otherwise weird problems will appear. 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$GDBSERVER" ]; then 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBSERVER=$(get_ndk_gdbserver "$ANDROID_NDK_ROOT" "$TARGET_ARCH") 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$GDBSERVER" ]; then 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find NDK gdbserver binary. use --gdbserver to specify \ 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)valid one!" 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --gdbserver=$GDBSERVER" 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check that ADB is in our path 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$ADB" ]; then 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADB=$(which adb 2>/dev/null) 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$ADB" ]; then 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find 'adb' tool in your path. Install it or use \ 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--adb=<file>" 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --adb=$ADB" 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check that it works minimally 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ADB_VERSION=$($ADB version 2>/dev/null) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "$ADB_VERSION" | fgrep -q -e "Android Debug Bridge" 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ $? != 0 ]; then 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Your 'adb' tool seems invalid, use --adb=<file> to specify a \ 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)different one: $ADB" 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If there are more than one device connected, and ANDROID_SERIAL is not 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# defined, print an error message. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NUM_DEVICES_PLUS2=$($ADB devices 2>/dev/null | wc -l) 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$NUM_DEVICES_PLUS2" -lt 3 -a -z "$ANDROID_SERIAL" ]; then 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "ERROR: There is more than one Android device connected to ADB." 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Please define ANDROID_SERIAL to specify which one to use." 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit 1 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A unique ID for this script's session. This needs to be the same in all 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# sub-shell commands we're going to launch, so take the PID of the launcher 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# process. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMP_ID=$$ 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Temporary directory, will get cleaned up on exit. 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMPDIR=/tmp/$USER-adb-gdb-tmp-$TMP_ID 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)mkdir -p "$TMPDIR" && rm -rf "$TMPDIR"/* 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_PIDFILE="$TMPDIR"/gdbserver-$TMP_ID.pid 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Run a command through adb shell, strip the extra \r from the output 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and return the correct status code to detect failures. This assumes 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# that the adb shell command prints a final \n to stdout. 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1+: command to run 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: command's stdout 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return: command's status 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Note: the command's stderr is lost 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb_shell () { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local TMPOUT="$(mktemp)" 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local LASTLINE RET 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ADB=${ADB:-adb} 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The weird sed rule is to strip the final \r on each output line 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Since 'adb shell' never returns the command's proper exit/status code, 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # we force it to print it as '%%<status>' in the temporary output file, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # which we will later strip from it. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $ADB shell $@ ";" echo "%%\$?" 2>/dev/null | \ 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sed -e 's![[:cntrl:]]!!g' > $TMPOUT 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Get last line in log, which contains the exit code from the command 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LASTLINE=$(sed -e '$!d' $TMPOUT) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Extract the status code from the end of the line, which must 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # be '%%<code>'. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RET=$(echo "$LASTLINE" | \ 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,RSTART+2); } }') 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Remove the status code from the last line. Note that this may result 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # in an empty line. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LASTLINE=$(echo "$LASTLINE" | \ 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,1,RSTART-1); } }') 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The output itself: all lines except the status code. 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sed -e '$d' $TMPOUT && printf "%s" "$LASTLINE" 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Remove temp file. 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rm -f $TMPOUT 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Exit with the appropriate status. 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return $RET 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If --force is specified, try to kill any gdbserver process started by the 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# same user on the device. Normally, these are killed automatically by the 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# script on exit, but there are a few corner cases where this would still 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# be needed. 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$FORCE" ]; then 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBSERVER_PIDS=$(adb_shell ps | awk '$9 ~ /gdbserver/ { print $2; }') 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for GDB_PID in $GDBSERVER_PIDS; do 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Killing previous gdbserver (PID=$GDB_PID)" 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb_shell kill -9 $GDB_PID 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$START" ]; then 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Starting $PROGRAM_NAME on device." 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb_shell am start -n $PACKAGE_NAME/$ACTIVITY 2>/dev/null 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb_shell ps | grep -q $PACKAGE_NAME 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail_panic "Could not start $PROGRAM_NAME on device. Are you sure the \ 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package is installed?" 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return the timestamp of a given time, as number of seconds since epoch. 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: file path 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: file timestamp 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_file_timestamp () { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stat -c %Y "$1" 2>/dev/null 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Detect the build type and symbol directory. This is done by finding 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the most recent sub-directory containing debug shared libraries under 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# $CHROMIUM_SRC/$CHROMIUM_OUT_DIR/ 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: $BUILDTYPE value, can be empty 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: nothing, but this sets SYMBOL_DIR 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)detect_symbol_dir () { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local SUBDIRS SUBDIR LIST DIR DIR_LIBS TSTAMP 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Note: Ninja places debug libraries under out/$BUILDTYPE/lib/, while 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Make places then under out/$BUILDTYPE/lib.target. 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$1" ]; then 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBDIRS="$1/lib $1/lib.target" 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBDIRS="Release/lib Debug/lib Release/lib.target Debug/lib.target" 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LIST=$TMPDIR/scan-subdirs-$$.txt 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf "" > "$LIST" 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for SUBDIR in $SUBDIRS; do 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DIR=$CHROMIUM_SRC/$CHROMIUM_OUT_DIR/$SUBDIR 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -d "$DIR" ]; then 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ignore build directories that don't contain symbol versions 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # of the shared libraries. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIR_LIBS=$(ls "$DIR"/lib*.so 2>/dev/null) 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$DIR_LIBS" ]; then 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "No shared libs: $DIR" 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TSTAMP=$(get_file_timestamp "$DIR") 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf "%s %s\n" "$TSTAMP" "$SUBDIR" >> "$LIST" 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBDIR=$(cat $LIST | sort -r | head -1 | cut -d" " -f2) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rm -f "$LIST" 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$SUBDIR" ]; then 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$1" ]; then 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Could not find any build directory under \ 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$CHROMIUM_SRC/$CHROMIUM_OUT_DIR. Please build the program first!" 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Could not find any $1 directory under \ 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$CHROMIUM_SRC/$CHROMIUM_OUT_DIR. Check your build type!" 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYMBOL_DIR=$CHROMIUM_SRC/$CHROMIUM_OUT_DIR/$SUBDIR 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --symbol-dir=$SYMBOL_DIR" 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$SYMBOL_DIR" ]; then 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detect_symbol_dir "$BUILDTYPE" 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Allow several concurrent debugging sessions 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET_GDBSERVER=/data/local/tmp/gdbserver-adb-gdb-$TMP_ID 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return the build fingerprint contained in a build.prop file. 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: path to build.prop file 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_build_fingerprint_from () { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat "$1" | grep -e '^ro.build.fingerprint=' | cut -d= -f2 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ORG_PULL_LIBS_DIR=$PULL_LIBS_DIR 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PULL_LIBS_DIR=${PULL_LIBS_DIR:-$DEFAULT_PULL_LIBS_DIR} 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_FINGERPRINT= 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEVICE_FINGERPRINT=$(adb_shell getprop ro.build.fingerprint) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Device build fingerprint: $DEVICE_FINGERPRINT" 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If --pull-libs-dir is not specified, and this is a platform build, look 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if we can use the symbolic libraries under $ANDROID_PRODUCT_OUT/symbols/ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# directly, if the build fingerprint matches the device. 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$ORG_PULL_LIBS_DIR" -a \ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$ANDROID_PRODUCT_OUT" -a \ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -f "$ANDROID_PRODUCT_OUT/system/build.prop" ]; then 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANDROID_FINGERPRINT=$(get_build_fingerprint_from \ 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$ANDROID_PRODUCT_OUT"/system/build.prop) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Android build fingerprint: $ANDROID_FINGERPRINT" 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$ANDROID_FINGERPRINT" = "$DEVICE_FINGERPRINT" ]; then 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Perfect match!" 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS_DIR=$ANDROID_PRODUCT_OUT/symbols 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOST_FINGERPRINT=$ANDROID_FINGERPRINT 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$PULL_LIBS" ]; then 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Ignoring --pull-libs since the device and platform build \ 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fingerprints match." 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_PULL_LIBS=true 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If neither --pull-libs an --no-pull-libs were specified, check the build 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# fingerprints of the device, and the cached system libraries on the host. 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$NO_PULL_LIBS" -a -z "$PULL_LIBS" ]; then 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$PULL_LIBS_DIR/build.prop" ]; then 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --pull-libs (no cached libraries)" 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS=true 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOST_FINGERPRINT=$(get_build_fingerprint_from "$PULL_LIBS_DIR/build.prop") 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Host build fingerprint: $HOST_FINGERPRINT" 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$HOST_FINGERPRINT" == "$DEVICE_FINGERPRINT" ]; then 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --no-pull-libs (fingerprint match)" 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_PULL_LIBS=true 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --pull-libs (fingerprint mismatch)" 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS=true 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Extract the system libraries from the device if necessary. 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Extracting system libraries into: $PULL_LIBS_DIR" 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)mkdir -p "$PULL_LIBS_DIR" 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Can't create --libs-dir directory: $PULL_LIBS_DIR" 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If requested, work for M-x gdb. The gdb indirections make it 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# difficult to pass --annotate=3 to the gdb binary itself. 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDB_ARGS= 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$ANNOTATE" ]; then 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDB_ARGS=$GDB_ARGS" --annotate=$ANNOTATE" 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Get the PID from the first argument or else find the PID of the 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# browser process. 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$PID" ]; then 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCESSNAME=$PACKAGE_NAME 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$SANDBOXED_INDEX" ]; then 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCESSNAME=$PROCESSNAME:sandboxed_process$SANDBOXED_INDEX 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif [ "$SANDBOXED" ]; then 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCESSNAME=$PROCESSNAME:sandboxed_process 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PID=$(adb_shell ps | \ 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '$9 ~ /^'$PROCESSNAME'/ { print $2; }' | head -1) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$PID" ]; then 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PID=$(adb_shell ps | \ 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '$9 == "'$PROCESSNAME'" { print $2; }' | head -1) 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$PID" ]; then 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$START" ]; then 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find application process PID, did it crash?" 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find application process PID, are you sure it is \ 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)running? Try using --start." 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Found process PID: $PID" 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)elif [ "$SANDBOXED" ]; then 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "WARNING: --sandboxed option ignored due to use of --pid." 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Determine if 'adb shell' runs as root or not. 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If so, we can launch gdbserver directly, otherwise, we have to 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# use run-as $PACKAGE_NAME ..., which requires the package to be debuggable. 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 8467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)if [ "$SU_PREFIX" ]; then 8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Need to check that this works properly. 8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SU_PREFIX_TEST_LOG=$TMPDIR/su-prefix.log 8497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) adb_shell $SU_PREFIX echo "foo" > $SU_PREFIX_TEST_LOG 2>&1 8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ $? != 0 -o "$(cat $SU_PREFIX_TEST_LOG)" != "foo" ]; then 8517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) echo "ERROR: Cannot use '$SU_PREFIX' as a valid su prefix:" 8527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) echo "$ adb shell $SU_PREFIX echo foo" 8537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cat $SU_PREFIX_TEST_LOG 8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) exit 1 8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 85646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_PREFIX="$SU_PREFIX" 8577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)else 8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SHELL_UID=$(adb shell cat /proc/self/status | \ 8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) awk '$1 == "Uid:" { print $2; }') 8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) log "Shell UID: $SHELL_UID" 8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ "$SHELL_UID" != 0 -o -n "$NO_ROOT" ]; then 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) COMMAND_PREFIX="run-as $PACKAGE_NAME" 8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) COMMAND_PREFIX= 8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)log "Command prefix: '$COMMAND_PREFIX'" 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Pull device's system libraries that are mapped by our process. 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Pulling all system libraries is too long, so determine which ones 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# we need by looking at /proc/$PID/maps instead 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Extracting system libraries into: $PULL_LIBS_DIR" 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rm -f $PULL_LIBS_DIR/build.prop 8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MAPPINGS=$(adb_shell $COMMAND_PREFIX cat /proc/$PID/maps) 8767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ $? != 0 ]; then 8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) echo "ERROR: Could not list process's memory mappings." 8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ "$SU_PREFIX" ]; then 8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) panic "Are you sure your --su-prefix is correct?" 8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 8817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) panic "Use --su-prefix if the application is not debuggable." 8827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 8837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 8847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SYSTEM_LIBS=$(echo "$MAPPINGS" | \ 8857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) awk '$6 ~ /\/system\/.*\.so$/ { print $6; }' | sort -u) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for SYSLIB in /system/bin/linker $SYSTEM_LIBS; do 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Pulling from device: $SYSLIB" 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DST_FILE=$PULL_LIBS_DIR$SYSLIB 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DST_DIR=$(dirname "$DST_FILE") 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mkdir -p "$DST_DIR" && adb pull $SYSLIB "$DST_FILE" 2>/dev/null 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail_panic "Could not pull $SYSLIB from device !?" 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Pulling device build.prop" 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb pull /system/build.prop $PULL_LIBS_DIR/build.prop 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail_panic "Could not pull device build.prop !?" 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find all the sub-directories of $PULL_LIBS_DIR, up to depth 4 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# so we can add them to solib-search-path later. 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SOLIB_DIRS=$(find $PULL_LIBS_DIR -mindepth 1 -maxdepth 4 -type d | \ 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grep -v "^$" | tr '\n' ':') 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This is a re-implementation of gdbclient, where we use compatible 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# versions of gdbserver and $GDBNAME to ensure that everything works 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# properly. 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Push gdbserver to the device 9094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)log "Pushing gdbserver $GDBSERVER to $TARGET_GDBSERVER" 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb push $GDBSERVER $TARGET_GDBSERVER &>/dev/null 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Could not copy gdbserver to the device!" 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PORT=5039 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_PORT=$PORT 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET_PORT=$PORT 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Select correct app_process for architecture. 918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)case $TARGET_ARCH in 919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arm|x86|mips) GDBEXEC=app_process;; 920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arm64|x86_64) GDBEXEC=app_process64;; 921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *) fail_panic "Unknown app_process for architecture!";; 922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)esac 923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Detect AddressSanitizer setup on the device. In that case app_process is a 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# script, and the real executable is app_process.real. 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GDBEXEC_ASAN=app_process.real 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)adb_shell ls /system/bin/$GDBEXEC_ASAN 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)if [ $? == 0 ]; then 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GDBEXEC=$GDBEXEC_ASAN 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)fi 9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Pull the app_process binary from the device. 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Pulling $GDBEXEC from device" 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb pull /system/bin/$GDBEXEC "$TMPDIR"/$GDBEXEC &>/dev/null 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Could not retrieve $GDBEXEC from the device!" 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Setup network redirection 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Setting network redirection (host:$HOST_PORT -> device:$TARGET_PORT)" 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb forward tcp:$HOST_PORT tcp:$TARGET_PORT 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Could not setup network redirection from \ 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)host:localhost:$HOST_PORT to device:localhost:$TARGET_PORT!" 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Start gdbserver in the background 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Note that using run-as requires the package to be debuggable. 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If not, this will fail horribly. The alternative is to run the 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# program as root, which requires of course root privileges. 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Maybe we should add a --root option to enable this? 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Starting gdbserver in the background:" 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_LOG=$TMPDIR/gdbserver-$TMP_ID.log 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "adb shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \ 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--attach $PID" 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)("$ADB" shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \ 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --attach $PID > $GDBSERVER_LOG 2>&1) & 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_PID=$! 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "$GDBSERVER_PID" > $GDBSERVER_PIDFILE 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "background job pid: $GDBSERVER_PID" 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check that it is still running after a few seconds. If not, this means we 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# could not properly attach to it 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sleep 2 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Job control: $(jobs -l)" 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STATE=$(jobs -l | awk '$2 == "'$GDBSERVER_PID'" { print $3; }') 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$STATE" != "Running" ]; then 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "ERROR: GDBServer could not attach to PID $PID!" 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Failure log (use --verbose for more information):" 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat $GDBSERVER_LOG 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit 1 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Generate a file containing useful GDB initialization commands 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)readonly COMMANDS=$TMPDIR/gdb.init 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Generating GDB initialization commands file: $COMMANDS" 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo -n "" > $COMMANDS 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "file $TMPDIR/$GDBEXEC" >> $COMMANDS 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "directory $CHROMIUM_SRC" >> $COMMANDS 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "set solib-absolute-prefix $PULL_LIBS_DIR" >> $COMMANDS 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "set solib-search-path $SOLIB_DIRS:$PULL_LIBS_DIR:$SYMBOL_DIR" \ 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) >> $COMMANDS 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "echo Attaching and reading symbols, this may take a while.." \ 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) >> $COMMANDS 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "target remote :$HOST_PORT" >> $COMMANDS 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$GDBINIT" ]; then 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat "$GDBINIT" >> $COMMANDS 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$VERBOSE" -gt 0 ]; then 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "### START $COMMANDS" 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat $COMMANDS 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "### END $COMMANDS" 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)log "Launching gdb client: $GDB $GDB_ARGS -x $COMMANDS" 996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)$GDB $GDB_ARGS -x $COMMANDS && 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rm -f "$GDBSERVER_PIDFILE" 998