在摩托罗拉手机上运行 ndk-gdb 时找不到包错误

Posted

技术标签:

【中文标题】在摩托罗拉手机上运行 ndk-gdb 时找不到包错误【英文标题】:Running ndk-gdb with package not found error on motorola phone 【发布时间】:2011-09-03 18:37:48 【问题描述】:

我有一个 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

【问题讨论】:

'$ adb shell run-as net.leifandersen.mobile.android.marblemachine ls' 工作吗? 不,我得到:run-as: Package 'net.leifandersen.mobile.android.marblemachine' 是未知的,而且,看起来有一个关于这类事情的错误报告,但是包不是三层深:code.google.com/p/android/issues/detail?id=13965。另外,正如我所说,该软件包仍列在 /data/system/packages.list 中。 【参考方案1】:
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 权限,我将如何着手解决问题(甚至首先找出问题所在)?谢谢。 (嗯,不是在 r5c 上,但 r5b 工作正常,我想类似的编辑也适用于 r5c)。 "因此,很遗憾,您的设备无法与 ndk-gdb 一起使用,因为 run-as 不起作用。如果您想使用该设备,您必须具有 root 权限。" - 不,run-as 中实际上存在一个错误。您不需要 root 权限。看我的回答。 你先生是我的英雄。民谣应该唱关于你的歌! run-as 显然在 4.3 上完全被破坏了:code.google.com/p/android/issues/detail?id=58373。 'FutureRelease' 状态意味着下一个 Android 版本应该会解决它,大概是即将到来的 4.4。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

原来是因为 /data/data 符号链接导致 run-as 无法正常工作。 Cyanogen 用于定制的 ROM。删除符号链接并将所有文件从 /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 的错误信息非常具有误导性。

【讨论】:

【参考方案4】:

遇到类似问题并运行:

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

会输出:

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

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

adb install MyApkFile.apk

【讨论】:

【参考方案5】:

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

在 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 了解更多信息。

【讨论】:

【参考方案6】:

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

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

/data/data/ 下的所有内容 名为 /data/dalvik-cache/* * 的文件

再次安装后,我又可以调试应用了。

【讨论】:

【参考方案7】:

如果有人使用三星 Galaxy S4/... 并获得了 4.4.2(最新库存 rom - 目前在所有国家/地区) - 你就完蛋了!三星错误。因此,按照上述答案之一中的说明进行根植,或获取另一台设备... 另一个解决方案是恢复到 Android 4.2.2(不是 4.4.2)- 4.3 之前的版本开始了这个问题。

【讨论】:

以上是关于在摩托罗拉手机上运行 ndk-gdb 时找不到包错误的主要内容,如果未能解决你的问题,请参考以下文章

在物理设备上运行时找不到 -lBugsnagReactNative 的库

Couchapp - 在 Windows 上运行“couchapp generate ...”时找不到默认模板

在 Docker-Compose 上运行时找不到模块

错误:在 apache 上运行 django 时找不到目标 WSGI 脚本或无法统计

在 Azure Devops 上运行构建时找不到资产文件 project.assets.json

在travis CI上运行Makefile时找不到gcc命令