问题描述
||
我有一个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
解决方法
run-as: Package \'net.leifandersen.mobile.android.marblemachine\' is unknown
因此,不幸的是,您的设备无法与ndk-gdb一起使用,因为运行方式不起作用。如果要使用该设备,则必须具有root特权。
编辑:
修改ndk-gdb脚本以摆脱运行方式的依赖关系。它仅适用于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
, 运行方式存在一个错误,如果您安装了过多的应用程序,则该错误将失败。通过从Evo 4G删除一些应用程序,我可以解决此问题。我是在NDK讨论组中找到的-http://groups.google.com/group/android-ndk/browse_thread/thread/ae9e8d5fe2716ae6?pli=1
, 今天,运行MIUI rom的Samsung Galaxy S遇到了同样的问题。 ndk-gdb始终报告“无法提取软件包的数据目录。您确定已安装的应用程序可调试吗?”
原来的原因是由于/ data / data符号链接,运行方式无法正常工作。定制的ROM中使用了Cyanogen。删除符号链接并将所有文件从/ datadata移至/ data / data解决了该问题。
Cyanogen 2.3修复:
ndk-gdb依赖于\'run-as \'命令,该命令本身对/ data / data目录进行了许多检查。在Cyanogen 2.3中,它是一个符号链接,运行方式失败并显示一条神秘消息,而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/
希望它可以帮助其他有类似问题的人。检查运行方式是否按预期工作。这不是因为您的二进制文件不可调试。 ndk-gdb的错误消息非常容易引起误解。
, 遇到类似的问题并正在运行:
adb shell run-as com.mypackagename /system/bin/sh -c pwd
将输出:
run-as: Package \'com.mypackagename\' has corrupt installation
解决方法是在设备上卸载,然后通过以下命令从命令行重新安装:
adb install MyApkFile.apk
, 我也遇到了这个问题,并发现它可能是由短软件包名称引起的!
在具有包含3个级别的软件包(例如a.b.c)的应用程序的Android 2.2系统上进行测试时,ndk-gdb无法正常工作。将软件包更改为具有4级或更高级别(例如a.b.c.d)或在Android 2.3或更高版本上运行可以解决该问题。
有关更多信息,请参见http://code.google.com/p/android/issues/detail?id=13965。
,仍然可能发生此问题:如果您以前已将应用程序安装为系统应用程序(在/ system / app中),请先将其卸载,然后再将其作为普通应用程序再次安装。在这种情况下,有可能还有一些文件由于您的应用程序没有权限而无法访问。
我通过卸载应用程序并手动删除与之相关的每条信息(具有adb shell和root特权)解决了该问题。据我所知,这包括:
/ data / data / <您的应用程序包>下的所有内容
名为/ data / dalvik-cache / * <您的应用程序包> *的文件
再次安装后,我可以再次调试该应用程序。
, 万一有人使用三星Galaxy S4 / ...并获得4.4.2(最新库存ROM-目前在所有国家/地区)-您就搞砸了!三星错误。因此,请按照上述答案之一中的说明root,或获取其他设备...
另一个解决方案是还原到Android 4.2.2(而非4.4.2)-4.3之前的版本,该版本开始了此问题。