aboutsummaryrefslogtreecommitdiff
path: root/ndk-gdb
diff options
context:
space:
mode:
authorAlexander Ivchenko <alexander.ivchenko@intel.com>2015-01-14 15:54:00 +0300
committerAlexander Ivchenko <alexander.ivchenko@intel.com>2015-01-15 17:17:32 +0300
commitf91d44c1ad581021f2e33aad7918b83fbafdbf40 (patch)
tree965e91a248c325be1772c4bfd4a04ff552047022 /ndk-gdb
parent13a99c7f71379070c19d366f803d7fd17041a728 (diff)
downloadndk-f91d44c1ad581021f2e33aad7918b83fbafdbf40.tar.gz
Fix ndk-gdb for debugging applications on x86_64
This patch fixes several issues: 1) Use ro.product.cpu.abilist64 and ro.product.cpu.abilist32 instead of ro.product.cpu.abi and ro.product.cpu.abi2. The latter ones for x86_64 do not contain x86 abi. 2) Pull app_process32 instead pf app_process when debugging 32-bit app on 64-bit device. 3) Pull linker64 for 64-bit. 4) Pull lib64/libc.so for 64-bit. 5) We have to push the gdbserver that matches the ABI of the app AND the ABI of the device, not just the one that matches the ABI of the device. Change-Id: Ibb0f264fdd007cb2a84aad87bcb396d24e2092e7 Signed-off-by: Alexander Ivchenko <alexander.ivchenko@intel.com>
Diffstat (limited to 'ndk-gdb')
-rwxr-xr-xndk-gdb94
1 files changed, 73 insertions, 21 deletions
diff --git a/ndk-gdb b/ndk-gdb
index a204ba257..6746a057a 100755
--- a/ndk-gdb
+++ b/ndk-gdb
@@ -549,13 +549,23 @@ fi
# And check that they are supported by the application
#
COMPAT_ABI=none
-adb_var_shell CPU_ABI1 getprop ro.product.cpu.abi
-adb_var_shell CPU_ABI2 getprop ro.product.cpu.abi2
-# Both CPU_ABI1 and CPU_ABI2 may contain multiple comma-delimited abis.
-# Concatanate CPU_ABI1 and CPU_ABI2 and replace all ',' with space.
-# Add trailing space to ease whole-word matching of APP_ABI.
-CPU_ABIS="$CPU_ABI1,$CPU_ABI2"
+# All modern Android images must support ro.product.cpu.abilist32
+# and ro.product.cpu.abilist64. Otherwise fall back to obsolete
+# ro.product.cpu.abi and ro.product.cpu.abi2
+adb_var_shell CPU_ABILIST64 getprop ro.product.cpu.abilist64
+adb_var_shell CPU_ABILIST32 getprop ro.product.cpu.abilist32
+CPU_ABIS="$CPU_ABILIST64,$CPU_ABILIST32"
+if [ -z "$CPU_ABILIST64" ] && [ -z "$CPU_ABILIST32" ] ; then
+ adb_var_shell CPU_ABI1 getprop ro.product.cpu.abi
+ adb_var_shell CPU_ABI2 getprop ro.product.cpu.abi2
+ CPU_ABIS="$CPU_ABI1,$CPU_ABI2"
+fi
+
+# Replace all ',' with space and add trailing space to
+# ease whole-word matching of APP_ABI
+CPU_ABILIST64=$(echo $CPU_ABILIST64 | tr ',' ' ')
+CPU_ABILIST32=$(echo $CPU_ABILIST32 | tr ',' ' ')
CPU_ABIS=$(echo $CPU_ABIS | tr ',' ' ')
log "Device CPU ABIs: $CPU_ABIS"
@@ -565,13 +575,38 @@ adb_var_shell BCFILES run-as $PACKAGE_NAME /system/bin/sh -c "ls lib/*.bc"
if [ $? = 0 ]; then
COMPAT_ABI="$UNKNOWN_ABI"
else
- for CPU_ABI in $CPU_ABIS; do
- if [ "$APP_ABIS" != "${APP_ABIS%$CPU_ABI *}" ] ; then
- COMPAT_ABI=$CPU_ABI
- break
- fi
- done
+ # Assume that compatible ABI is 32-bit
+ COMPAT_ABI_BITS=32
+ # First look compatible ABI in the list of 64-bit ABIs
+ if [ -n "$CPU_ABILIST64" ] ; then
+ for CPU_ABI64 in $CPU_ABILIST64; do
+ if [ "$APP_ABIS" != "${APP_ABIS%$CPU_ABI64 *}" ] ; then
+ COMPAT_ABI=$CPU_ABI64
+ COMPAT_ABI_BITS=64
+ break
+ fi
+ done
+ fi
+ # If we found nothing - look among 32-bit ABIs
+ if [ "$COMPAT_ABI" = none ] && [ -n "$CPU_ABILIST32" ] ; then
+ for CPU_ABI32 in $CPU_ABILIST32; do
+ if [ "$APP_ABIS" != "${APP_ABIS%$CPU_ABI32 *}" ] ; then
+ COMPAT_ABI=$CPU_ABI32
+ break
+ fi
+ done
+ fi
+ # Lastly, lets check ro.product.cpu.abi and ro.product.cpu.abi2
+ if [ "$COMPAT_ABI" = none ] && [ -z "$CPU_ABILIST64" ] && [ -z "$CPU_ABILIST32" ]; then
+ for CPU_ABI in $CPU_ABIS; do
+ if [ "$APP_ABIS" != "${APP_ABIS%$CPU_ABI *}" ] ; then
+ COMPAT_ABI=$CPU_ABI
+ break
+ fi
+ done
+ fi
fi
+
if [ "$COMPAT_ABI" = none ] ; then
echo "ERROR: The device does not support the application's targetted CPU ABIs!"
echo " Device supports: $CPU_ABIS"
@@ -649,8 +684,8 @@ if [ $? != 0 ]; then
TARGET_ARCH=none
for ANDROID_ARCH in $ANDROID_NDK_ROOT/prebuilt/android-*; do
- ANDROID_ARCH=${ANDROID_ARCH#*android-}
- if [ x"$CPU_ABIS" != x"${CPU_ABIS#$ANDROID_ARCH*}" ]; then
+ ANDROID_ARCH=${ANDROID_ARCH#$ANDROID_NDK_ROOT/prebuilt/android-}
+ if [ "$COMPAT_ABI" = "$ANDROID_ARCH" ]; then
TARGET_ARCH=$ANDROID_ARCH
break;
fi
@@ -754,16 +789,33 @@ if [ $? != 0 ] ; then
exit 1
fi
+# If we are debugging 32-bit application on 64-bit device
+# then we need to pull app_process32, not app_process
+APP_PROCESS_NAME=app_process
+if [ "$COMPAT_ABI_BITS" = 32 ] && [ -n "$CPU_ABILIST64" ] ; then
+ APP_PROCESS_NAME=app_process32
+ log "We are debugging 32-bit app on 64-bit device"
+fi
+
+# If we are debugging 64-bit app, then we need to pull linker64
+# and libc.so from lib64 directory
+LINKER_NAME=linker
+LIBDIR_NAME=lib
+if [ "$COMPAT_ABI_BITS" = 64 ] ; then
+ LINKER_NAME=linker64
+ LIBDIR_NAME=lib64
+fi
+
# Get the app_server binary from the device
-APP_PROCESS=$APP_OUT/app_process
-run adb_cmd pull /system/bin/app_process `native_path $APP_PROCESS`
-log "Pulled app_process from device/emulator."
+APP_PROCESS=$APP_OUT/$APP_PROCESS_NAME
+run adb_cmd pull /system/bin/$APP_PROCESS_NAME `native_path $APP_PROCESS`
+log "Pulled $APP_PROCESS_NAME from device/emulator."
-run adb_cmd pull /system/bin/linker `native_path $APP_OUT/linker`
-log "Pulled linker from device/emulator."
+run adb_cmd pull /system/bin/$LINKER_NAME `native_path $APP_OUT/linker`
+log "Pulled $LINKER_NAME from device/emulator."
-run adb_cmd pull /system/lib/libc.so `native_path $APP_OUT/libc.so`
-log "Pulled libc.so from device/emulator."
+run adb_cmd pull /system/$LIBDIR_NAME/libc.so `native_path $APP_OUT/libc.so`
+log "Pulled /system/$LIBDIR_NAME/libc.so from device/emulator."
# Setup JDB connection, for --start or --launch
if [ "$OPTION_START" = "yes" ] || [ -n "$OPTION_LAUNCH" ] ; then