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 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FILE=$NDK_DIR/toolchains/$NAME-4.9/prebuilt/$SUBPATH 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$FILE" ]; then 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FILE=$NDK_DIR/toolchains/$NAME-4.8/prebuilt/$SUBPATH 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$FILE" ]; then 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FILE= 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$FILE" 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Find the path to an NDK's toolchain full prefix for a given architecture 48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# $1: NDK install path 48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# $2: NDK target architecture name 48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# Out: install path + binary prefix (e.g. 49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)# ".../path/to/bin/arm-linux-androideabi-") 49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)get_ndk_toolchain_fullprefix () { 49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local NDK_DIR="$1" 49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local ARCH="$2" 49490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) local TARGET NAME HOST_OS HOST_ARCH GCC CONFIG 49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # NOTE: This will need to be updated if the NDK changes the names or moves 49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # the location of its prebuilt toolchains. 49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # 49990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC= 50090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_OS=$(get_ndk_host_system) 50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) HOST_ARCH=$(get_ndk_host_arch) 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CONFIG=$(get_arch_gnu_config $ARCH) 50390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC=$(get_ndk_toolchain_prebuilt \ 50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$NDK_DIR" "$ARCH" "$HOST_OS-$HOST_ARCH/bin/$CONFIG-gcc") 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ -z "$GCC" -a "$HOST_ARCH" = "x86_64" ]; then 50690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC=$(get_ndk_toolchain_prebuilt \ 50790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$NDK_DIR" "$ARCH" "$HOST_OS-x86/bin/$CONFIG-gcc") 50890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ ! -f "$GCC" -a "$ARCH" = "x86" ]; then 51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # Special case, the x86 toolchain used to be incorrectly 51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # named i686-android-linux-gcc! 51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GCC=$(get_ndk_toolchain_prebuilt \ 51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$NDK_DIR" "$ARCH" "$HOST_OS-x86/bin/i686-android-linux-gcc") 51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if [ -z "$GCC" ]; then 51690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) panic "Cannot find Android NDK toolchain for '$ARCH' architecture. \ 51790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)Please verify your NDK installation!" 51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fi 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) echo "${GCC%%gcc}" 52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 52190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: NDK install path 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $2: target architecture. 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_ndk_gdbserver () { 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local NDK_DIR="$1" 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ARCH=$2 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local BINARY 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The location has moved after NDK r8 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BINARY=$NDK_DIR/prebuilt/android-$ARCH/gdbserver/gdbserver 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$BINARY" ]; then 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BINARY=$(get_ndk_toolchain_prebuilt "$NDK_DIR" "$ARCH" gdbserver) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "$BINARY" 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check/probe the path to the Android toolchain installation. Always 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# use the NDK versions of gdb and gdbserver. They must match to avoid 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# issues when both binaries do not speak the same wire protocol. 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$TOOLCHAIN" ]; then 54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ANDROID_TOOLCHAIN=$(get_ndk_toolchain_fullprefix \ 54390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "$ANDROID_NDK_ROOT" "$TARGET_ARCH") 54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ANDROID_TOOLCHAIN=$(dirname "$ANDROID_TOOLCHAIN") 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --toolchain=$ANDROID_TOOLCHAIN" 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Be flexible, allow one to specify either the install path or the bin 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # sub-directory in --toolchain: 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -d "$TOOLCHAIN/bin" ]; then 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOOLCHAIN=$TOOLCHAIN/bin 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANDROID_TOOLCHAIN=$TOOLCHAIN 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Cosmetic: Remove trailing directory separator. 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ANDROID_TOOLCHAIN=${ANDROID_TOOLCHAIN%/} 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find host GDB client binary 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$GDB" ]; then 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GDB=$(which $ANDROID_TOOLCHAIN/*-$GDBEXEPOSTFIX 2>/dev/null | head -1) 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if [ -z "$GDB" ]; then 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) panic "Can't find Android gdb client in your path, check your \ 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)--toolchain or --gdb path." 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) fi 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) log "Host gdb client: $GDB" 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find gdbserver binary, we will later push it to /data/local/tmp 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This ensures that both gdbserver and $GDB talk the same binary protocol, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# otherwise weird problems will appear. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$GDBSERVER" ]; then 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBSERVER=$(get_ndk_gdbserver "$ANDROID_NDK_ROOT" "$TARGET_ARCH") 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$GDBSERVER" ]; then 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find NDK gdbserver binary. use --gdbserver to specify \ 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)valid one!" 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --gdbserver=$GDBSERVER" 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check that ADB is in our path 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$ADB" ]; then 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADB=$(which adb 2>/dev/null) 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$ADB" ]; then 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find 'adb' tool in your path. Install it or use \ 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--adb=<file>" 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --adb=$ADB" 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check that it works minimally 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ADB_VERSION=$($ADB version 2>/dev/null) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "$ADB_VERSION" | fgrep -q -e "Android Debug Bridge" 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ $? != 0 ]; then 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Your 'adb' tool seems invalid, use --adb=<file> to specify a \ 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)different one: $ADB" 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If there are more than one device connected, and ANDROID_SERIAL is not 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# defined, print an error message. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NUM_DEVICES_PLUS2=$($ADB devices 2>/dev/null | wc -l) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$NUM_DEVICES_PLUS2" -lt 3 -a -z "$ANDROID_SERIAL" ]; then 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "ERROR: There is more than one Android device connected to ADB." 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Please define ANDROID_SERIAL to specify which one to use." 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) exit 1 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# A unique ID for this script's session. This needs to be the same in all 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# sub-shell commands we're going to launch, so take the PID of the launcher 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# process. 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMP_ID=$$ 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Temporary directory, will get cleaned up on exit. 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TMPDIR=/tmp/$USER-adb-gdb-tmp-$TMP_ID 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)mkdir -p "$TMPDIR" && rm -rf "$TMPDIR"/* 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_PIDFILE="$TMPDIR"/gdbserver-$TMP_ID.pid 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Run a command through adb shell, strip the extra \r from the output 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and return the correct status code to detect failures. This assumes 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# that the adb shell command prints a final \n to stdout. 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1+: command to run 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: command's stdout 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return: command's status 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Note: the command's stderr is lost 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb_shell () { 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local TMPOUT="$(mktemp)" 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local LASTLINE RET 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local ADB=${ADB:-adb} 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The weird sed rule is to strip the final \r on each output line 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Since 'adb shell' never returns the command's proper exit/status code, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # we force it to print it as '%%<status>' in the temporary output file, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # which we will later strip from it. 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) $ADB shell $@ ";" echo "%%\$?" 2>/dev/null | \ 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sed -e 's![[:cntrl:]]!!g' > $TMPOUT 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Get last line in log, which contains the exit code from the command 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LASTLINE=$(sed -e '$!d' $TMPOUT) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Extract the status code from the end of the line, which must 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # be '%%<code>'. 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RET=$(echo "$LASTLINE" | \ 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,RSTART+2); } }') 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Remove the status code from the last line. Note that this may result 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # in an empty line. 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LASTLINE=$(echo "$LASTLINE" | \ 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '{ if (match($0, "%%[0-9]+$")) { print substr($0,1,RSTART-1); } }') 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # The output itself: all lines except the status code. 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sed -e '$d' $TMPOUT && printf "%s" "$LASTLINE" 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Remove temp file. 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rm -f $TMPOUT 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Exit with the appropriate status. 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return $RET 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If --force is specified, try to kill any gdbserver process started by the 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# same user on the device. Normally, these are killed automatically by the 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# script on exit, but there are a few corner cases where this would still 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# be needed. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$FORCE" ]; then 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDBSERVER_PIDS=$(adb_shell ps | awk '$9 ~ /gdbserver/ { print $2; }') 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for GDB_PID in $GDBSERVER_PIDS; do 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Killing previous gdbserver (PID=$GDB_PID)" 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb_shell kill -9 $GDB_PID 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$START" ]; then 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Starting $PROGRAM_NAME on device." 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb_shell am start -n $PACKAGE_NAME/$ACTIVITY 2>/dev/null 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb_shell ps | grep -q $PACKAGE_NAME 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail_panic "Could not start $PROGRAM_NAME on device. Are you sure the \ 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package is installed?" 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return the timestamp of a given time, as number of seconds since epoch. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: file path 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: file timestamp 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_file_timestamp () { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stat -c %Y "$1" 2>/dev/null 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Detect the build type and symbol directory. This is done by finding 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the most recent sub-directory containing debug shared libraries under 687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)# $CHROMIUM_SRC/$CHROMIUM_OUT_DIR/ 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: $BUILDTYPE value, can be empty 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Out: nothing, but this sets SYMBOL_DIR 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)detect_symbol_dir () { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local SUBDIRS SUBDIR LIST DIR DIR_LIBS TSTAMP 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Note: Ninja places debug libraries under out/$BUILDTYPE/lib/, while 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Make places then under out/$BUILDTYPE/lib.target. 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$1" ]; then 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBDIRS="$1/lib $1/lib.target" 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBDIRS="Release/lib Debug/lib Release/lib.target Debug/lib.target" 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LIST=$TMPDIR/scan-subdirs-$$.txt 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf "" > "$LIST" 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for SUBDIR in $SUBDIRS; do 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DIR=$CHROMIUM_SRC/$CHROMIUM_OUT_DIR/$SUBDIR 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -d "$DIR" ]; then 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ignore build directories that don't contain symbol versions 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # of the shared libraries. 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DIR_LIBS=$(ls "$DIR"/lib*.so 2>/dev/null) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$DIR_LIBS" ]; then 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "No shared libs: $DIR" 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) continue 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TSTAMP=$(get_file_timestamp "$DIR") 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printf "%s %s\n" "$TSTAMP" "$SUBDIR" >> "$LIST" 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SUBDIR=$(cat $LIST | sort -r | head -1 | cut -d" " -f2) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rm -f "$LIST" 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$SUBDIR" ]; then 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$1" ]; then 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Could not find any build directory under \ 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$CHROMIUM_SRC/$CHROMIUM_OUT_DIR. Please build the program first!" 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Could not find any $1 directory under \ 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)$CHROMIUM_SRC/$CHROMIUM_OUT_DIR. Check your build type!" 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SYMBOL_DIR=$CHROMIUM_SRC/$CHROMIUM_OUT_DIR/$SUBDIR 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --symbol-dir=$SYMBOL_DIR" 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$SYMBOL_DIR" ]; then 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) detect_symbol_dir "$BUILDTYPE" 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Allow several concurrent debugging sessions 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET_GDBSERVER=/data/local/tmp/gdbserver-adb-gdb-$TMP_ID 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Return the build fingerprint contained in a build.prop file. 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $1: path to build.prop file 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_build_fingerprint_from () { 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat "$1" | grep -e '^ro.build.fingerprint=' | cut -d= -f2 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ORG_PULL_LIBS_DIR=$PULL_LIBS_DIR 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PULL_LIBS_DIR=${PULL_LIBS_DIR:-$DEFAULT_PULL_LIBS_DIR} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_FINGERPRINT= 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEVICE_FINGERPRINT=$(adb_shell getprop ro.build.fingerprint) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Device build fingerprint: $DEVICE_FINGERPRINT" 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If --pull-libs-dir is not specified, and this is a platform build, look 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# if we can use the symbolic libraries under $ANDROID_PRODUCT_OUT/symbols/ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# directly, if the build fingerprint matches the device. 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$ORG_PULL_LIBS_DIR" -a \ 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$ANDROID_PRODUCT_OUT" -a \ 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) -f "$ANDROID_PRODUCT_OUT/system/build.prop" ]; then 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANDROID_FINGERPRINT=$(get_build_fingerprint_from \ 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$ANDROID_PRODUCT_OUT"/system/build.prop) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Android build fingerprint: $ANDROID_FINGERPRINT" 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$ANDROID_FINGERPRINT" = "$DEVICE_FINGERPRINT" ]; then 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Perfect match!" 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS_DIR=$ANDROID_PRODUCT_OUT/symbols 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOST_FINGERPRINT=$ANDROID_FINGERPRINT 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$PULL_LIBS" ]; then 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Ignoring --pull-libs since the device and platform build \ 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fingerprints match." 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_PULL_LIBS=true 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If neither --pull-libs an --no-pull-libs were specified, check the build 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# fingerprints of the device, and the cached system libraries on the host. 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$NO_PULL_LIBS" -a -z "$PULL_LIBS" ]; then 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ ! -f "$PULL_LIBS_DIR/build.prop" ]; then 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --pull-libs (no cached libraries)" 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS=true 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HOST_FINGERPRINT=$(get_build_fingerprint_from "$PULL_LIBS_DIR/build.prop") 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Host build fingerprint: $HOST_FINGERPRINT" 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$HOST_FINGERPRINT" == "$DEVICE_FINGERPRINT" ]; then 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --no-pull-libs (fingerprint match)" 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_PULL_LIBS=true 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Auto-config: --pull-libs (fingerprint mismatch)" 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PULL_LIBS=true 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Extract the system libraries from the device if necessary. 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Extracting system libraries into: $PULL_LIBS_DIR" 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)mkdir -p "$PULL_LIBS_DIR" 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Can't create --libs-dir directory: $PULL_LIBS_DIR" 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If requested, work for M-x gdb. The gdb indirections make it 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# difficult to pass --annotate=3 to the gdb binary itself. 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDB_ARGS= 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$ANNOTATE" ]; then 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GDB_ARGS=$GDB_ARGS" --annotate=$ANNOTATE" 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Get the PID from the first argument or else find the PID of the 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# browser process. 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ -z "$PID" ]; then 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCESSNAME=$PACKAGE_NAME 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$SANDBOXED_INDEX" ]; then 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCESSNAME=$PROCESSNAME:sandboxed_process$SANDBOXED_INDEX 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif [ "$SANDBOXED" ]; then 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PROCESSNAME=$PROCESSNAME:sandboxed_process 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PID=$(adb_shell ps | \ 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '$9 ~ /^'$PROCESSNAME'/ { print $2; }' | head -1) 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$PID" ]; then 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PID=$(adb_shell ps | \ 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) awk '$9 == "'$PROCESSNAME'" { print $2; }' | head -1) 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ -z "$PID" ]; then 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if [ "$START" ]; then 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find application process PID, did it crash?" 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panic "Can't find application process PID, are you sure it is \ 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)running? Try using --start." 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fi 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log "Found process PID: $PID" 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)elif [ "$SANDBOXED" ]; then 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "WARNING: --sandboxed option ignored due to use of --pid." 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Determine if 'adb shell' runs as root or not. 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If so, we can launch gdbserver directly, otherwise, we have to 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# use run-as $PACKAGE_NAME ..., which requires the package to be debuggable. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 8437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)if [ "$SU_PREFIX" ]; then 8447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) # Need to check that this works properly. 8457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SU_PREFIX_TEST_LOG=$TMPDIR/su-prefix.log 8467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) adb_shell $SU_PREFIX echo "foo" > $SU_PREFIX_TEST_LOG 2>&1 8477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ $? != 0 -o "$(cat $SU_PREFIX_TEST_LOG)" != "foo" ]; then 8487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) echo "ERROR: Cannot use '$SU_PREFIX' as a valid su prefix:" 8497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) echo "$ adb shell $SU_PREFIX echo foo" 8507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cat $SU_PREFIX_TEST_LOG 8517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) exit 1 8527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 85346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) COMMAND_PREFIX="$SU_PREFIX" 8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)else 8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SHELL_UID=$(adb shell cat /proc/self/status | \ 8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) awk '$1 == "Uid:" { print $2; }') 8577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) log "Shell UID: $SHELL_UID" 8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ "$SHELL_UID" != 0 -o -n "$NO_ROOT" ]; then 8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) COMMAND_PREFIX="run-as $PACKAGE_NAME" 8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) COMMAND_PREFIX= 8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)log "Command prefix: '$COMMAND_PREFIX'" 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Pull device's system libraries that are mapped by our process. 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Pulling all system libraries is too long, so determine which ones 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# we need by looking at /proc/$PID/maps instead 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$PULL_LIBS" -a -z "$NO_PULL_LIBS" ]; then 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Extracting system libraries into: $PULL_LIBS_DIR" 8717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rm -f $PULL_LIBS_DIR/build.prop 8727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) MAPPINGS=$(adb_shell $COMMAND_PREFIX cat /proc/$PID/maps) 8737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ $? != 0 ]; then 8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) echo "ERROR: Could not list process's memory mappings." 8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if [ "$SU_PREFIX" ]; then 8767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) panic "Are you sure your --su-prefix is correct?" 8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) panic "Use --su-prefix if the application is not debuggable." 8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fi 8817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SYSTEM_LIBS=$(echo "$MAPPINGS" | \ 8827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) awk '$6 ~ /\/system\/.*\.so$/ { print $6; }' | sort -u) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for SYSLIB in /system/bin/linker $SYSTEM_LIBS; do 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Pulling from device: $SYSLIB" 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DST_FILE=$PULL_LIBS_DIR$SYSLIB 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DST_DIR=$(dirname "$DST_FILE") 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mkdir -p "$DST_DIR" && adb pull $SYSLIB "$DST_FILE" 2>/dev/null 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail_panic "Could not pull $SYSLIB from device !?" 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) done 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "Pulling device build.prop" 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adb pull /system/build.prop $PULL_LIBS_DIR/build.prop 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fail_panic "Could not pull device build.prop !?" 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Find all the sub-directories of $PULL_LIBS_DIR, up to depth 4 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# so we can add them to solib-search-path later. 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SOLIB_DIRS=$(find $PULL_LIBS_DIR -mindepth 1 -maxdepth 4 -type d | \ 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grep -v "^$" | tr '\n' ':') 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This is a re-implementation of gdbclient, where we use compatible 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# versions of gdbserver and $GDBNAME to ensure that everything works 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# properly. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Push gdbserver to the device 9064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)log "Pushing gdbserver $GDBSERVER to $TARGET_GDBSERVER" 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb push $GDBSERVER $TARGET_GDBSERVER &>/dev/null 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Could not copy gdbserver to the device!" 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PORT=5039 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HOST_PORT=$PORT 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TARGET_PORT=$PORT 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Select correct app_process for architecture. 915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)case $TARGET_ARCH in 916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arm|x86|mips) GDBEXEC=app_process;; 917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arm64|x86_64) GDBEXEC=app_process64;; 918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *) fail_panic "Unknown app_process for architecture!";; 919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)esac 920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Detect AddressSanitizer setup on the device. In that case app_process is a 9225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# script, and the real executable is app_process.real. 9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)GDBEXEC_ASAN=app_process.real 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)adb_shell ls /system/bin/$GDBEXEC_ASAN 9255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)if [ $? == 0 ]; then 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GDBEXEC=$GDBEXEC_ASAN 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)fi 9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# Pull the app_process binary from the device. 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Pulling $GDBEXEC from device" 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb pull /system/bin/$GDBEXEC "$TMPDIR"/$GDBEXEC &>/dev/null 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Could not retrieve $GDBEXEC from the device!" 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Setup network redirection 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Setting network redirection (host:$HOST_PORT -> device:$TARGET_PORT)" 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)adb forward tcp:$HOST_PORT tcp:$TARGET_PORT 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fail_panic "Could not setup network redirection from \ 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)host:localhost:$HOST_PORT to device:localhost:$TARGET_PORT!" 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Start gdbserver in the background 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Note that using run-as requires the package to be debuggable. 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# If not, this will fail horribly. The alternative is to run the 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# program as root, which requires of course root privileges. 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Maybe we should add a --root option to enable this? 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Starting gdbserver in the background:" 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_LOG=$TMPDIR/gdbserver-$TMP_ID.log 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "adb shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \ 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)--attach $PID" 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)("$ADB" shell $COMMAND_PREFIX $TARGET_GDBSERVER :$TARGET_PORT \ 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) --attach $PID > $GDBSERVER_LOG 2>&1) & 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GDBSERVER_PID=$! 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "$GDBSERVER_PID" > $GDBSERVER_PIDFILE 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "background job pid: $GDBSERVER_PID" 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Check that it is still running after a few seconds. If not, this means we 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# could not properly attach to it 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sleep 2 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Job control: $(jobs -l)" 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STATE=$(jobs -l | awk '$2 == "'$GDBSERVER_PID'" { print $3; }') 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$STATE" != "Running" ]; then 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "ERROR: GDBServer could not attach to PID $PID!" 9645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if [ $(adb_shell su -c getenforce) != "Permissive" ]; then 9655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) echo "Device mode is Enforcing. Changing Device mode to Permissive " 9665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) $(adb_shell su -c setenforce 0) 9675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if [ $(adb_shell su -c getenforce) != "Permissive" ]; then 9685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) echo "ERROR: Failed to Change Device mode to Permissive" 9695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) echo "Failure log (use --verbose for more information):" 9705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cat $GDBSERVER_LOG 9715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) exit 1 9725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) fi 9735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) else 9745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) echo "Failure log (use --verbose for more information):" 9755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cat $GDBSERVER_LOG 9765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) exit 1 9775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) fi 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Generate a file containing useful GDB initialization commands 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)readonly COMMANDS=$TMPDIR/gdb.init 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)log "Generating GDB initialization commands file: $COMMANDS" 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo -n "" > $COMMANDS 9841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "set print pretty 1" >> $COMMANDS 9851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "python" >> $COMMANDS 9861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "import sys" >> $COMMANDS 9871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "sys.path.insert(0, '$CHROMIUM_SRC/tools/gdb/')" >> $COMMANDS 9881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "try:" >> $COMMANDS 9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho " import gdb_chrome" >> $COMMANDS 9901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "finally:" >> $COMMANDS 9911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho " sys.path.pop(0)" >> $COMMANDS 9921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciecho "end" >> $COMMANDS 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "file $TMPDIR/$GDBEXEC" >> $COMMANDS 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "directory $CHROMIUM_SRC" >> $COMMANDS 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "set solib-absolute-prefix $PULL_LIBS_DIR" >> $COMMANDS 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "set solib-search-path $SOLIB_DIRS:$PULL_LIBS_DIR:$SYMBOL_DIR" \ 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) >> $COMMANDS 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "echo Attaching and reading symbols, this may take a while.." \ 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) >> $COMMANDS 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "target remote :$HOST_PORT" >> $COMMANDS 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$GDBINIT" ]; then 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat "$GDBINIT" >> $COMMANDS 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$VERBOSE" -gt 0 ]; then 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "### START $COMMANDS" 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cat $COMMANDS 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) echo "### END $COMMANDS" 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)log "Launching gdb client: $GDB $GDB_ARGS -x $COMMANDS" 1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)$GDB $GDB_ARGS -x $COMMANDS && 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)rm -f "$GDBSERVER_PIDFILE" 1015