android - 无法找到 android NDK 堆栈跟踪

标签 android c++ android-ndk stack-trace

我正在开发一个应用程序,它在带有 SIG_SEGV 的 NDK 代码中崩溃。这会导致应用程序挂起大约 15 秒,然后 Android 会提示我强制关闭它。这会将 java 堆栈跟踪打印到 logcat,但我没有看到 NDK 的任何堆栈跟踪。我已经使用 ADB 重定向了 stdio,但我仍然没有看到堆栈跟踪。我如何将 C++ 堆栈跟踪打印到 logcat 或在哪里打印?
使用 Android 2.3.4
NDK r8b

最佳答案

“强制关闭”对话框是由崩溃的应用程序发布的。这听起来像是 Dalvik 崩溃而不是本地崩溃。如果进程收到 SIGSEGV,它应该通知 debuggerd 并退出,并在日志中留下痕迹。在您的问题中包含崩溃的 logcat 输出可能会有所帮助。

无论如何,当线程处于 native 代码中时,最新版本的 Android 包括与 Dalvik 堆栈转储混合的 native 跟踪。如果你有一个运行最新版本 Android 的 root 设备,你可以要求 debuggerd 使用 adb shell debuggerd -b <pid> 转储所有线程的踪迹。 .

不过,您使用的是 Android 2.3.x,所以这些都对您没有帮助。您最好的选择是向进程发送致命信号以获取 debuggerd 故障转储。信号必须发送两次,例如:

adb shell kill -6 <pid> ; sleep 1 ; adb shell kill -6 <pid>

这需要 Root设备,因为“shell”用户不能向任意进程发送信号。根据具体发生的情况,您应该能够在“强制关闭”对话框仍在屏幕上时执行此操作......但是如果线程在没有停止进程的情况下设法崩溃,那么可能没有堆栈可以获取来自的痕迹。

关于android - 无法找到 android NDK 堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19036851/

相关文章:

android - HTTP Live Streaming 中的时间戳不连续问题

android - 单击其他项目时如何在android中的RecyclerView中展开和折叠cardview

android ndk 构建 : global cflags (or any other params)

android - 如何在 ndk 应用程序中链接任何库

android - gradle experimental 通过 srcDir srcFile 指令包含文件目录

android - 在 andengine 中使用 Texture Packer 加载动画

java - 二维碰撞速成类

c++ - istream_iterator 行为

c++ - 如何故意减慢编译速度?

c++ - 为什么操作系统不拒绝为该程序分配内存?