2013-09-26 135 views
2

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

回答

1

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

无论如何,当线程处于本机代码时,最新版本的Android包含与Dalvik堆栈转储混合的本机跟踪。如果您的设备运行最新版本的Android,则可以要求debuggerd将adb shell debuggerd -b <pid>的所有线程的跟踪转储出来。

虽然你在Android 2.3.x,所以没有任何帮助你。您最好的选择是发送进程一个致命信号来获取调试器崩溃转储。信号必须被发送两次,例如:

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

这需要有根设备,如在“壳”用户不能将信号发送到任意的处理。根据究竟发生了什么,当“强制关闭”对话框仍然在屏幕上时,你应该可以做到这一点......但是如果线程设法在不降低进程的情况下崩溃,那么可能没有堆栈来获取一丝不苟。

+0

我得到了“无法杀死pid 26646:操作不允许” – agoaj

+0

我忘了说你需要一个根植设备(答案更新)。 – fadden

0

您可以使用下面的代码获取登录

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

,并添加以下库

#include <android/log.h> 
+2

这将不打印堆栈跟踪。 – agoaj

+0

您不能在NDK中打印堆栈跟踪,而是可以在其未提供的NDK中打印日志,但仅提供了日志。 –

+0

如果无法打印堆栈跟踪,则类似ndk-stack的工具对于包括在sdk中。 – agoaj