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

时间:2011-05-28 00:47:12

标签: android gdb android-ndk remote-debugging android-ndk-r5

我有一个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(默认端口)上似乎没有任何东西。而afaik,我没有阻止该连接的防火墙。我正在开发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

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

run-as存在错误,如果您安装了太多应用,则会失败。通过从我的Evo 4G中删除一些应用程序,我能够解决这个问题。我在NDK讨论组中发现了这一点 - http://groups.google.com/group/android-ndk/browse_thread/thread/ae9e8d5fe2716ae6?pli=1

答案 2 :(得分:2)

今天我遇到了同样的问题,三星Galaxy S正在运行MIUI rom。 ndk-gdb总是报告&#34;无法解压缩数据包的数据目录。您确定已安装的应用程序是否可调试?&#34;

原来,原因是由于/ data / data符号链接而导致运行不起作用。 Cyanogen用于定制ROM。删除符号链接并将所有文件从/ datadata移动到/ data / data解决了问题。

Cyanogen 2.3修复:

ndk-gdb依赖于&#39; run-as&#39;命令,它本身对/ 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的错误信息非常容易引起误解。

答案 3 :(得分:1)

遇到类似的问题并且正在运行:

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

会输出:

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

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

adb install MyApkFile.apk

答案 4 :(得分: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

答案 5 :(得分:0)

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

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

  • / data / data /&lt; your app package&gt;
  • 下的所有内容
  • 名为/ data / dalvik-cache / *&lt; your app package&gt; *
  • 的文件

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

答案 6 :(得分:0)

如果有人使用三星Galaxy S4 / ...并获得4.4.2(最新股票rom - 现在所有国家/地区) - 你搞砸了!三星虫。所以root如上面的一个答案中所解释的,或者获得另一个设备...... 另一个解决方案是恢复到Android 4.2.2(而不是4.4.2) - 4.3版之前启动了这个问题。