在摩托罗拉手机上运行ndk-gdb时出现“package not found”错误

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 上进行开发。

编辑2:嗯……看起来使用新的 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

“$ adb shell run-as net.leifandersen.mobile.android.marblemachine ls” 这个命令可以执行吗? - Kazuki Sakamoto
不行,我得到的是:run-as: 包 'net.leifandersen.mobile.android.marblemachine' 是未知的,而且看起来有一个关于这种情况的错误报告,但该包不是三个级别深的:http://code.google.com/p/android/issues/detail?id=13965。 此外,正如我所说,该包仍然列在 /data/system/packages.list 中。 - Leif Andersen
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

有了 root 权限,我该如何解决这个问题(或者首先找出问题所在)?谢谢。 - Leif Andersen
(好吧,不是在r5c上,但r5b可以正常工作,我想类似的编辑对于r5c也会起作用。) - Leif Andersen
很遗憾,您的设备无法与ndk-gdb一起使用,因为run-as不起作用。如果您想要使用该设备,您必须拥有root权限。- 不,实际上run-as存在一个bug。您不需要root权限。请查看我的答案。 - Brad
您是我的英雄。应该唱关于您的传奇! - celavek
1
run-as 在 4.3 上显然完全失效:https://code.google.com/p/android/issues/detail?id=58373。'FutureRelease' 状态意味着下一个 Android 版本应该会解决它,大概是即将发布的 4.4 版本。 - jrr
谢谢@jrr,我有更新至4.3的Nexus4,并且遇到了同样的问题。在阅读了您的评论两天后,我终于找到了解决方法。要进行本地调试,我需要对我的Nexus4进行root,然后尝试或应用Android 4.3新镜像(会丢失手机上的所有数据),或者稍等一下等待Android 4.4更新。 - hB0

4

2

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

原因是由于/run-as不起作用导致/data/data符号链接。修改了ROM后使用的Cyanogen。删除符号链接并将所有文件从/datadata移动到/data/data解决了这个问题。

Cyanogen 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?

一个解决方法是使用符号链接重新创建/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给出的错误信息非常误导人。


1

我遇到过类似的问题,尝试运行:

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

将输出:

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

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

adb install MyApkFile.apk

0

这个问题还有另一种可能性:如果你之前将应用程序安装为系统应用(在/system/app目录下),然后卸载它,再次以普通应用程序的方式安装。在这种情况下,可能仍然存在一些文件,你的应用程序无法访问,因为它没有权限。

我通过卸载我的应用程序,并手动删除与之相关的所有信息(使用adb shell和root权限)。据我所知,这包括:

  • /data/data/ <你的应用程序包名>
  • /data/dalvik-cache/* <你的应用程序包名>*

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


0
如果有人使用三星Galaxy S4/...并安装了4.4.2(最新的原厂ROM-现在所有国家都是如此),那么你就被坑了!这是三星的一个Bug。因此,请按照上面某个答案中所解释的方法进行Root操作,或者获取另一台设备......另一个解决方案是恢复到Android 4.2.2(而不是4.4.2) - 这是开始出现此问题的4.3版本之前的版本。

0

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

在Android 2.2系统上测试一个有3级包名(例如:a.b.c)的应用程序时,ndk-gdb将无法工作。将包名更改为4级或更多级(例如:a.b.c.d),或在Android 2.3或更高版本上运行即可解决此问题。

有关更多信息,请参见http://code.google.com/p/android/issues/detail?id=13965


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接