2

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

4

3 回答 3

1

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

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

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

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

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

于 2013-09-26T21:18:28.693 回答
0

有一个名为CheckJNI的工具,那里有设置它的教程。

于 2013-09-26T19:44:52.740 回答
0

您可以使用以下代码获取Log

 __android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", Str);

并添加以下库

#include <android/log.h>
于 2013-09-26T19:25:16.750 回答