在motorola手机上运行带有包找不到错误的ndk-gdb

Lei*_*sen 14 android gdb remote-debugging android-ndk android-ndk-r5

我有一个C++ Android应用程序,我正在尝试使用ndk-gdb进行调试.应用程序确实使用多个线程,但据推测,ndk的r5支持多个线程.此外,我甚至没有达到gdb启动的程度.我运行命令:

ndk-gdb --start --force --verbose
Run Code Online (Sandbox Code Playgroud)

然后它找到ndk和sdk(或至少adb)的正确路径,以及所需的ABI和诸如此类的东西.

$ ndk-gdb --start --force --verbose
Android NDK installation path: /home/leif/eclipse/android-ndk-r5b
Using default adb command: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.26
Using final ADB command: '/home/leif/eclipse/android-sdk-linux_86/platform-tools/adb'
Using auto-detected project path: .
Found package name: net.leifandersen.mobile.android.marblemachine
ABIs targetted by application: armeabi
Device API Level: 10
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi
Run Code Online (Sandbox Code Playgroud)

然后它查找gdb服务器,并找到它,包括正确的PID,然后启动活动.

但是,它告诉我无法找到包:

Setup network redirection
## COMMAND: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb shell run-as <package name> lib/gdbserver +debug-socket --attach 16040
## COMMAND: /home/leif/eclipse/android-sdk-linux_86/platform-tools/adb forward tcp:5039 localfilesystem:run-as: Package '<package name>' is unknown/debug-socket
Run Code Online (Sandbox Code Playgroud)

然后,如果您不正确地使用adb(帮助文件),它会吐出您将获得的内容,然后是:

ERROR: Could not setup network redirection to gdbserver?
       Maybe using --port=<port> to use a different TCP port might help?
run-as: Package '<package name>' is unknown
Run Code Online (Sandbox Code Playgroud)

我查看了/data/system/packages.list,是的,我的apk肯定在那里,它指向的位置在文件系统上是正确的.所以这不是问题.

本教程:http://vilimpoc.org/blog/2010/09/23/hello-gdbserver-a-debuggable-jni-example-for-android/建议删除并重新安装,以及清理eclipse构建.

我没有使用eclipse来构建软件包,但我确实清理了所有内容并从头开始编译,删除并重新安装以免运气.

有没有人有类似的问题,你是如何解决它们的?谢谢.

编辑:哦,我尝试了一个不同的端口无济于事,无论如何在5039(默认端口)上似乎没有任何东西.而afaik,我没有阻止该连接的防火墙.我正在开发Ubuntu 11.04.

编辑2:嗯......它看起来像新的ndk(r5c),错误信息现在也改变了:

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?
Run Code Online (Sandbox Code Playgroud)

是的,在清单中将debuggable设置为true,并且所有本机代码都是使用以下内容构建的:

LOCAL_CFLAGS           := -Wall -g
LOCAL_LDFLAGS          := -Wl,-Map,xxx.map
Run Code Online (Sandbox Code Playgroud)

Kaz*_*oto 15

run-as: Package 'net.leifandersen.mobile.android.marblemachine' is unknown
Run Code Online (Sandbox Code Playgroud)

因此,遗憾的是,您的设备无法与ndk-gdb一起使用,因为run-as不起作用.如果要使用该设备,则必须具有root权限.

编辑:

修改ndk-gdb脚本以消除run-as的依赖性.它仅适用于root权限('adb shell whoami'应该是'root').

--- ndk-gdb 2011-02-24 16:55:07.000000000 +0900
+++ ndk-gdb-root    2011-06-09 08:35:04.000000000 +0900
@@ -465,7 +465,7 @@
 log "Using app out directory: $APP_OUT"

 # Find the <dataDir> of the package on the device
-DATA_DIR=`adb_shell run-as $PACKAGE_NAME /system/bin/sh -c pwd`
+DATA_DIR="/data/data/$PACKAGE_NAME"
 log "Found data directory: '$DATA_DIR'"
 if [ $? != 0 -o -z "$DATA_DIR" ] ; then
     echo "ERROR: Could not extract package's data directory. Are you sure that"
@@ -543,7 +543,7 @@

 # Launch gdbserver now
 DEBUG_SOCKET=debug-socket
-run $ADB_CMD shell run-as $PACKAGE_NAME lib/gdbserver +$DEBUG_SOCKET --attach $PID &
+run $ADB_CMD shell "(cd $DATA_DIR; lib/gdbserver +$DEBUG_SOCKET --attach $PID)" &
 if [ $? != 0 ] ; then
     echo "ERROR: Could not launch gdbserver on the device?"
     exit 1
Run Code Online (Sandbox Code Playgroud)