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