【问题标题】:Android NDK debugging in Eclipse - how to stop segfaults/SIGILL that only occur when stepping in native codeEclipse 中的 Android NDK 调试 - 如何停止仅在步入本机代码时发生的段错误/SIGILL
【发布时间】: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


【解决方案1】:

我注意到的一件事是 armeabi-v7a 在某些设备上调试本机代码时效果不佳。尝试只为 armeabi 构建,看看是否有帮助。

【讨论】:

    【解决方案2】:

    如果它适用于 armeabi 而不适用于 armeabi-v7a,这应该是构建问题。解压bin目录下的apk文件,查看armeabi和armeabi-v7a中的库文件是否一致。

    【讨论】:

      【解决方案3】:

      使用 -march=armv4 编译 c++ 源文件

      在 build/core/combo/arm/yourarch.mk 中输入 -march=armv4 然后执行 mm -B showcommands 来检查它是否被使用。

      那么gdbserver就可以处理了。

      【讨论】:

        猜你喜欢
        • 2023-03-25
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多