无法找到android NDK堆栈跟踪

时间:2013-09-26 19:21:15

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

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

3 个答案:

答案 0 :(得分:1)

“强制关闭”对话框由崩溃的应用程序发布。这听起来像是Dalvik的崩溃,而不是原生的崩溃。如果进程正在接收SIGSEGV,它应该通知debuggerd并退出,在日志中留下跟踪。在您的问题中包含崩溃的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”用户无法向任意进程发送信号。根据具体情况,你应该可以在“强制关闭”对话框仍然在屏幕上时执行此操作...但是如果线程设法崩溃而没有将进程关闭,那么可能没有堆栈可以获得来自的踪迹。

答案 1 :(得分:0)

您可以使用以下代码获取日志

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

并添加以下库

#include <android/log.h>

答案 2 :(得分:0)

有一个名为CheckJNI的工具,设置它的教程是there