14

我有一个 C++ Android 应用程序,我正在尝试使用 ndk-gdb 进行调试。该应用程序确实使用了多个线程,但据说 ndk 的 r5 支持多个线程。另外,我什至没有达到 gdb 启动的地步。我运行命令:

ndk-gdb --start --force --verbose

然后它会为 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

然后它查找 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

然后它会吐出如果您不正确地使用 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

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

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

我没有使用 eclipse 来构建包,但我确实清理了所有内容并从头开始编译、删除并重新安装,但没有成功。

有没有人遇到过类似的问题,你是怎么解决的?谢谢你。

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

Edit2:嗯......看起来新的ndk(r5c),错误消息现在也发生了变化:

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?

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

LOCAL_CFLAGS           := -Wall -g
LOCAL_LDFLAGS          := -Wl,-Map,xxx.map
4

7 回答 7

15
run-as: Package 'net.leifandersen.mobile.android.marblemachine' is unknown

因此,不幸的是,您的设备无法与 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
于 2011-06-08T04:56:29.637 回答
4

run-as 有一个错误,如果您安装了太多应用程序,它将失败。我可以通过从我的 Evo 4G 中删除一些应用程序来解决这个问题。我在 NDK 讨论组中找到了这个 - http://groups.google.com/group/android-ndk/browse_thread/thread/ae9e8d5fe2716ae6?pli=1

于 2011-11-13T04:15:32.957 回答
2

我今天在运行 MIUI rom 的三星 Galaxy S 时遇到了同样的问题。ndk-gdb 总是报告“无法提取包的数据目录。您确定您安装的应用程序是可调试的吗?”

事实证明,原因是由于 /data/data 符号链接导致 run-as 无法正常工作。Cyanogen 用于定制的 ROM。删除符号链接并将所有文件从 /datadata 移动到 /data/data 解决了这个问题。

氰 2.3 修复:

ndk-gdb 依赖于“run-as”命令,该命令本身会对 /data/data 目录进行多项检查。在 Cyanogen 2.3 中,它是一个符号链接,并且 run-as 失败并显示一条神秘消息,并且 ndk-gdb 失败并返回 [2]:

ERROR: Could not extract package's data directory. Are you sure that
       your installed application is debuggable?

一种解决方法是使用 symlink 重新创建 /data/data :

cd /data/data /datadata.break-run-as
mkdir -m 771 /data/data/
chown system: v
mv /datadata/* /data/data/

http://en.wikibooks.org/wiki/OpenGL_Programming/Installation/Android_NDK

http://forum.cyanogenmod.com/topic/27657-run-as-not-working-due-to-datadata-symlink/

希望它可以帮助其他有类似问题的人。检查 run-as 是否按预期工作。这不是因为您的二进制文件不可调试。ndk-gdb 的错误信息非常具有误导性。

于 2012-10-20T00:18:57.833 回答
1

有类似的问题并运行:

adb shell run-as com.mypackagename /system/bin/sh -c pwd

会输出:

run-as: Package 'com.mypackagename' has corrupt installation

修复是在设备上卸载然后通过命令行重新安装:

adb install MyApkFile.apk
于 2012-11-14T08:06:30.620 回答
0

这个问题还有另一种可能发生:如果您之前已将应用程序安装为系统应用程序(在 /system/app 中),请将其卸载,然后作为普通应用程序再次安装。在这种情况下,可能仍然存在一些文件,您的应用程序无法访问,因为它没有权限。

我通过卸载我的应用程序并手动删除与其相关的每条信息(使用 adb shell 和 root 权限)解决了这个问题。据我所知,这包括:

  • /data/data/<您的应用程序包>下的所有内容
  • 名为 /data/dalvik-cache/* <您的应用程序包>* 的文件

再次安装后,我能够再次调试应用程序。

于 2013-01-14T15:00:06.953 回答
0

万一有人在使用三星 Galaxy S4/... 并获得 4.4.2(最新的股票 rom - 现在在所有国家/地区) - 你就完蛋了!三星错误。因此,如上述答案之一所述,root 或获取另一台设备......另一种解决方案是恢复到 Android 4.2.2(不是 4.4.2) - 开始此问题的 4.3 之前的版本。

于 2015-01-18T11:42:13.087 回答
0

我也遇到过这个问题,发现可能是包名短引起的!

在 Android 2.2 系统上使用具有 3 个级别的包(例如:abc)的应用程序进行测试时,ndk-gdb 将无法工作。将包更改为具有 4 个或更多级别 (egabcd) 或在 Android 2.3 或更高版本上运行解决了该问题。

有关详细信息,请参阅http://code.google.com/p/android/issues/detail?id=13965

于 2012-02-29T22:35:55.483 回答