【问题标题】:Android NDK debugging: device can't be openedAndroid NDK调试:设备打不开
【发布时间】:2013-04-11 00:28:28
【问题描述】:

我正在尝试调试我的本机库一段时间,但它无法正常工作。本机代码可以工作并编译,但出于优化目的,我确实需要调试本机代码。

我已逐步阅读并遵循了许多教程(例如tutorial1tutorial2),但我遇到了一些我无法找到解决方案的错误。

我已经设置了 Android 和 C++ 调试配置,在我使用 Android 调试配置进行调试后,它在加载库(只有一个)后会遇到断点。我去 cygwin 看看我的设备是否被检测到(它是)。然后运行:

$ ndk-gdb --start --verbose

这给了我以下输出:

Android NDK installation path: /cygdrive/c/Android/android-ndk/android-ndk-r8
Using default adb command: /cygdrive/c/Android/android-sdk/platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.29
Using ADB flags:
Using auto-detected project path: .
Found package name: com.mypackage
ABIs targetted by application: armeabi-v7a
Device API Level: 15
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi-v7a
Using gdb setup init: ./libs/armeabi-v7a/gdb.setup
Using toolchain prefix: /cygdrive/c/Android/android-ndk/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-
Using app out directory: ./obj/local/armeabi-v7a
Found debuggable flag: true
Found device gdbserver: /data/data/com.mypackage/lib/gdbserver
Found data directory: '/data/data/com.mypackage'
Found first launchable activity: .MainActivity
Launching activity: com.mypackage/.MainActivity
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb shell am start -n com.mypackage/.MainActivity
Starting: Intent { cmp=com.mypackage/.MainActivity }
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb shell sleep 2
Found running PID: 6907
Launched gdbserver succesfully.
Setup network redirection
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb shell run-as com.mypackage lib/gdbserver +debug-socket --attach 6907
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb forward tcp:5039 localfilesystem:/data/data/com.mypackage/debug-socket
Attached; pid = 6907
Could not open remote device: Invalid argument.
Detaching process(es): 6907
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb pull /system/bin/app_process obj/local/armeabi-v7a/app_process
2405 KB/s (9852 bytes in 0.004s)
Pulled app_process from device/emulator.
## COMMAND: /cygdrive/c/Android/android-sdk/platform-tools/adb pull /system/lib/libc.so obj/local/armeabi-v7a/libc.so
4994 KB/s (286412 bytes in 0.056s)
Pulled libc.so from device/emulator.

User@This-PC /cygdrive/c/Development/MyAppAndroid/trunk/MyApp
$

可以看到gdbserver已经启动成功了,很好,但是不知道为什么会这样:

Could not open remote device: Invalid argument

因为 adb 可以连接到设备(如前所述)。在那之后,在我看来(我对 cygwin 不太熟悉)gdb 只是关闭了所有内容,这会使 eclipse 中的 c++ Debug 也失败。当我运行它时,出现以下错误:

76-target-select remote localhost:5039
&"Remote communication error: Bad file descriptor.\n"
Remote communication error: Bad file descriptor.
76^error,msg="Remote communication error: Bad file descriptor."

有什么东西可以阻止 adb 检测到我的设备吗?我一直使用这个设备进行测试(没有 c++ 调试),没有问题。

还是端口错误?

【问题讨论】:

  • 我使用了您的“教程 1”链接中的方法,并且效果很好(针对 armeabi-v7a 进行了修改)。我注意到您正在调用 ndk-gdb 而不是 ndk-gdb-eclipse 以及使用 gdp.setup 而不是 gdb2.setup。我想你放弃了教程中的方法?它的哪一部分不适合你?
  • 我刚刚复制了 ndk-gdb 并将其命名为 ndk-gdb-original 并使用我的新文件的名称。与 gdb.setup 相同。我怀疑这些更改会导致问题,但事实并非如此。所以我按照教程中的所有步骤进行操作。不工作的部分是 Could not open remote device: Invalid argument 我不知道为什么它没有连接到它,因为在我运行 ndk-gdb 之前,我可以使用 adb devices

标签: debugging android-ndk


【解决方案1】:

我遇到了同样的问题,所以我在 ndk-gdb 文件中替换了以下几行:

原文:

run adb_cmd shell run-as $PACKAGE_NAME lib/gdbserver +$DEBUG_SOCKET --attach $PID & 

替换:

run adb_cmd shell run-as $PACKAGE_NAME lib/gdbserver tcp:5888 --attach $PID & 

和原文:

run adb_cmd forward tcp:$DEBUG_PORT localfilesystem:$DATA_DIR/$DEBUG_SOCKET 

替换:

run adb_cmd forward tcp:5039 tcp:5888

修复了“无效参数”问题。

P.

【讨论】:

  • 在我的头在屏幕上敲了几个星期之后,这个解决方案与另一个建议一起工作,在 ndk-gdb 脚本中将 awk 更改为 gawk。谢谢你们的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多