diff options
author | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2015-01-14 15:54:00 +0300 |
---|---|---|
committer | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2015-01-15 17:17:32 +0300 |
commit | f91d44c1ad581021f2e33aad7918b83fbafdbf40 (patch) | |
tree | 965e91a248c325be1772c4bfd4a04ff552047022 /ndk-gdb | |
parent | 13a99c7f71379070c19d366f803d7fd17041a728 (diff) | |
download | ndk-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-x | ndk-gdb | 94 |
1 files changed, 73 insertions, 21 deletions
@@ -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 |