diff --git a/envsetup.sh b/envsetup.sh index 531ffd9ad..38790b454 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1,3 +1,13 @@ +# These unsets should stay to clear the old functions from any long running +# shells. +# TODO(danalbert): Remove this in a day or so. +unset -f gdbwrapper +unset -f get_symbols_directory +unset -f adb_get_product_device +unset -f adb_get_traced_by +unset -f gdbclient +unset -f gdbclient_old + function hmm() { cat < [port number]" - return -1 - fi - local DEVICE=$(adb_get_product_device) - - if [ -z "$DEVICE" ]; then - echo "Error: Unable to get device name. Please check if device is connected and ANDROID_SERIAL is set." - return -2 - fi - - if [ -n "$2" ]; then - PORT=$2 - fi - - local ROOT=$(gettop) - if [ -z "$ROOT" ]; then - # This is for the situation with downloaded symbols (from the build server) - # we check if they are available. - ROOT=`realpath .` - fi - - local OUT_ROOT="$ROOT/out/target/product/$DEVICE" - local SYMBOLS_DIR="$OUT_ROOT/symbols" - local IS_TAPAS_USER="$(get_build_var TARGET_BUILD_APPS)" - local TAPAS_SYMBOLS_DIR= - - if [ $IS_TAPAS_USER ]; then - TAPAS_SYMBOLS_DIR=$(get_symbols_directory) - fi - - if [ ! -d $SYMBOLS_DIR ]; then - if [ $IS_TAPAS_USER ]; then - mkdir -p $SYMBOLS_DIR/system/bin - else - echo "Error: couldn't find symbols: $SYMBOLS_DIR does not exist or is not a directory." - return -3 - fi - fi - - # let's figure out which executable we are about to debug - - # check if user specified a name -> resolve to pid - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - PROCESS_NAME=$PID - PID=$(pid --exact $PROCESS_NAME) - if [ -z "$PID" ]; then - echo "Error: couldn't resolve pid by process name: $PROCESS_NAME" - return -4 - else - echo "Resolved pid for $PROCESS_NAME is $PID" - fi - fi - - local EXE=`adb shell readlink /proc/$PID/exe | sed s/.$//` - - if [ -z "$EXE" ]; then - echo "Error: no such pid=$PID - is process still alive?" - return -4 - fi - - local LOCAL_EXE_PATH=$SYMBOLS_DIR$EXE - - if [ ! -f $LOCAL_EXE_PATH ]; then - if [ $IS_TAPAS_USER ]; then - adb pull $EXE $LOCAL_EXE_PATH - else - echo "Error: unable to find symbols for executable $EXE: file $LOCAL_EXE_PATH does not exist" - return -5 - fi - fi - - local USE64BIT="" - - if [[ "$(file $LOCAL_EXE_PATH)" =~ 64-bit ]]; then - USE64BIT="64" - fi - - # and now linker for tapas users... - if [ -n "$IS_TAPAS_USER" -a ! -f "$SYMBOLS_DIR/system/bin/linker$USE64BIT" ]; then - adb pull /system/bin/linker$USE64BIT $SYMBOLS_DIR/system/bin/linker$USE64BIT - fi - - local GDB= - local GDB64= - local CPU_ABI=`adb shell getprop ro.product.cpu.abilist | sed s/.$//` - # TODO: we assume these are available via $PATH - if [[ $CPU_ABI =~ (^|,)arm64 ]]; then - GDB=arm-linux-androideabi-gdb - GDB64=aarch64-linux-android-gdb - elif [[ $CPU_ABI =~ (^|,)arm ]]; then - GDB=arm-linux-androideabi-gdb - elif [[ $CPU_ABI =~ (^|,)x86_64 ]]; then - GDB=x86_64-linux-android-gdb - elif [[ $CPU_ABI =~ (^|,)x86 ]]; then - GDB=x86_64-linux-android-gdb - elif [[ $CPU_ABI =~ (^|,)mips64 ]]; then - GDB=mipsel-linux-android-gdb - GDB64=mips64el-linux-android-gdb - elif [[ $CPU_ABI =~ (^|,)mips ]]; then - GDB=mipsel-linux-android-gdb - else - echo "Error: unrecognized cpu.abilist: $CPU_ABI" - return -6 - fi - - # TODO: check if tracing process is gdbserver and not some random strace... - if [ "$(adb_get_traced_by $PID)" -eq 0 ]; then - # start gdbserver - echo "Starting gdbserver..." - # TODO: check if adb is already listening $PORT - # to avoid unnecessary calls - echo ". adb forward for port=$PORT..." - adb forward tcp:$PORT tcp:$PORT - echo ". starting gdbserver to attach to pid=$PID..." - adb shell gdbserver$USE64BIT :$PORT --attach $PID & - echo ". give it couple of seconds to start..." - sleep 2 - echo ". done" - else - echo "It looks like gdbserver is already attached to $PID (process is traced), trying to connect to it using local port=$PORT" - adb forward tcp:$PORT tcp:$PORT - fi - - local OUT_SO_SYMBOLS=$SYMBOLS_DIR/system/lib$USE64BIT - local TAPAS_OUT_SO_SYMBOLS=$TAPAS_SYMBOLS_DIR/system/lib$USE64BIT - local OUT_VENDOR_SO_SYMBOLS=$SYMBOLS_DIR/vendor/lib$USE64BIT - local ART_CMD="" - - local SOLIB_SYSROOT=$SYMBOLS_DIR - local SOLIB_SEARCHPATH=$OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl - - if [ $IS_TAPAS_USER ]; then - SOLIB_SYSROOT=$TAPAS_SYMBOLS_DIR:$SOLIB_SYSROOT - SOLIB_SEARCHPATH=$TAPAS_OUT_SO_SYMBOLS:$SOLIB_SEARCHPATH - fi - - echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $SOLIB_SYSROOT" - echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $SOLIB_SEARCHPATH" - local DALVIK_GDB_SCRIPT=$ROOT/development/scripts/gdb/dalvik.gdb - if [ -f $DALVIK_GDB_SCRIPT ]; then - echo >>"$OUT_ROOT/gdbclient.cmds" "source $DALVIK_GDB_SCRIPT" - ART_CMD="art-on" - else - echo "Warning: couldn't find $DALVIK_GDB_SCRIPT - ART debugging options will not be available" - fi - echo >>"$OUT_ROOT/gdbclient.cmds" "target remote :$PORT" - if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then - echo >> "$OUT_ROOT/gdbclient.cmds" $ART_CMD - fi - - echo >>"$OUT_ROOT/gdbclient.cmds" "" - - local WHICH_GDB=$GDB - - if [ -n "$USE64BIT" -a -n "$GDB64" ]; then - WHICH_GDB=$GDB64 - fi - - gdbwrapper $WHICH_GDB "$OUT_ROOT/gdbclient.cmds" "$LOCAL_EXE_PATH" -} - -# gdbclient now determines whether the user wants to debug a 32-bit or 64-bit -# executable, set up the approriate gdbserver, then invokes the proper host -# gdb. -function gdbclient_old() -{ - local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT) - local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED) - local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) - local OUT_VENDOR_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_VENDOR_SHARED_LIBRARIES_UNSTRIPPED) - local OUT_EXE_SYMBOLS=$(get_symbols_directory) - local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) - local ARCH=$(get_build_var TARGET_ARCH) - local GDB - case "$ARCH" in - arm) GDB=arm-linux-androideabi-gdb;; - arm64) GDB=arm-linux-androideabi-gdb; GDB64=aarch64-linux-android-gdb;; - mips|mips64) GDB=mips64el-linux-android-gdb;; - x86) GDB=x86_64-linux-android-gdb;; - x86_64) GDB=x86_64-linux-android-gdb;; - *) echo "Unknown arch $ARCH"; return 1;; - esac - - if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then - local EXE="$1" - if [ "$EXE" ] ; then - EXE=$1 - if [[ $EXE =~ ^[^/].* ]] ; then - EXE="system/bin/"$EXE - fi - else - EXE="app_process" - fi - - local PORT="$2" - if [ "$PORT" ] ; then - PORT=$2 - else - PORT=":5039" - fi - - local PID="$3" - if [ "$PID" ] ; then - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - PID=`pid $3` - if [[ ! "$PID" =~ ^[0-9]+$ ]] ; then - # that likely didn't work because of returning multiple processes - # try again, filtering by root processes (don't contain colon) - PID=`adb shell ps | \grep $3 | \grep -v ":" | awk '{print $2}'` - if [[ ! "$PID" =~ ^[0-9]+$ ]] - then - echo "Couldn't resolve '$3' to single PID" - return 1 - else - echo "" - echo "WARNING: multiple processes matching '$3' observed, using root process" - echo "" - fi - fi - fi - adb forward "tcp$PORT" "tcp$PORT" - local USE64BIT="$(is64bit $PID)" - adb shell gdbserver$USE64BIT $PORT --attach $PID & - sleep 2 - else - echo "" - echo "If you haven't done so already, do this first on the device:" - echo " gdbserver $PORT /system/bin/$EXE" - echo " or" - echo " gdbserver $PORT --attach " - echo "" - fi - - OUT_SO_SYMBOLS=$OUT_SO_SYMBOLS$USE64BIT - OUT_VENDOR_SO_SYMBOLS=$OUT_VENDOR_SO_SYMBOLS$USE64BIT - - echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" - echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx:$OUT_VENDOR_SO_SYMBOLS:$OUT_VENDOR_SO_SYMBOLS/hw:$OUT_VENDOR_SO_SYMBOLS/egl" - echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" - echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" - # Enable special debugging for ART processes. - if [[ $EXE =~ (^|/)(app_process|dalvikvm)(|32|64)$ ]]; then - echo >> "$OUT_ROOT/gdbclient.cmds" "art-on" - fi - echo >>"$OUT_ROOT/gdbclient.cmds" "" - - local WHICH_GDB= - # 64-bit exe found - if [ "$USE64BIT" != "" ] ; then - WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB64 - # 32-bit exe / 32-bit platform - elif [ "$(get_build_var TARGET_2ND_ARCH)" = "" ]; then - WHICH_GDB=$ANDROID_TOOLCHAIN/$GDB - # 32-bit exe / 64-bit platform - else - WHICH_GDB=$ANDROID_TOOLCHAIN_2ND_ARCH/$GDB - fi - - gdbwrapper $WHICH_GDB "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" - else - echo "Unable to determine build system output dir." - fi - -} - case `uname -s` in Darwin) function sgrep()