【发布时间】:2011-08-19 11:21:33
【问题描述】:
我已经使用 Android NDK(在 Windows XP 上,使用 Cygwin)在 Eclipse 中为本机代码设置了调试,我可以在 Java 和本机代码中设置断点,并且调试器将正确地中断它们。我的问题是,在单步执行本机代码时,我经常会遇到分段错误/SIGILL,而这些错误在继续越过断点时不会发生。
- 我的应用程序可以按照 AndroidManifest.xml 中的定义进行调试
- 我已更改 (NDK)/build/core/build-binary.mk 以防止它在
APP_OPTIM被定义为调试时删除调试符号,它位于我的 jni 目录中的 Application.mk 文件中 - 我在 Android.mk 文件中定义了
LOCAL_CFLAGS := -g -O0,并且我也分别尝试了这些标志中的每一个
我已经读到这个问题与生成的优化代码有关,但是使用-O0 关闭优化对我的问题没有影响。我在构建时也遇到过使用NDK_BUILD=1 标志,但在AndroidManifest.xml 中定义debuggable=true 显然具有相同的效果。
我在模拟器(运行 2.3.3)和设备(运行 2.2 - 令人惊讶地没有我预期的线程问题)上都尝试过,结果相似(尽管如果我没记错的话,失败发生在代码的不同点)。
是否有人对我可以尝试的可能修复/步骤有任何见解,和/或能够成功地单步执行本机代码而没有问题?
非常感谢
编辑:这从来没有真正解决,但任何想看看我的 NDK 调试指南的人,你可以找到它here。
编辑 2:一旦新版本的 NDK 出来,我就得到了这个问题的答案,现在这个问题可能是多余的。我的指南可能仍然有效,但我有一段时间没有使用 NDK,所以我不能保证它的持续正确性。我已经接受了我的答案,因为这三个人基本上都说同样的话,这是第一个提交的。
【问题讨论】:
-
嗨。你曾经能够让原生调试正常工作吗?由于某种原因,我无法进入 (F5) 任何本机功能。
-
@Kevin 嗨。我链接到的指南确实将 NDK 调试设置为工作状态。但是,正如您所说,它不处理单步“通过”JNI。但由于它将处理在 Java 和 C/C++ 中设置的断点,因此您可以通过在 NDK 调用的 C/C++ 函数的入口点设置断点来获得等效项,然后继续 (F8) 到您想要的断点进入本机代码。希望对您有所帮助。
-
我也观察到了这一点。如果我设置了启动断点,它似乎会发生更多。如果我运行应用程序然后附加(即使存在断点)我也看不到问题。无论如何,它是相当不稳定的。
-
我也有 NDK 调试的设置,当我遇到断点并尝试单步执行代码时,我没有收到任何 seg 错误。大多数情况下,在模拟器上它太慢并且与 gdbserver 的连接超时但段错误并非如此。另一种情况是不要在 Elcipse 中同时调试 java 和 Native 代码。
-
我的直觉是,我认为是 gdbserver 的错误导致运行 eclipse 来调试您的代码。过程中不小心触动了一些内存,实际上是无效的。
标签: android eclipse debugging android-ndk