找不到 android NDK 堆栈跟踪
Posted
技术标签:
【中文标题】找不到 android NDK 堆栈跟踪【英文标题】:Unable to find android NDK stack-trace 【发布时间】:2013-10-02 22:19:08 【问题描述】:我正在开发一个应用程序,该应用程序在带有 SIG_SEGV 的 NDK 代码中崩溃。这会导致应用程序挂起大约 15 秒,然后 android 会提示我强制关闭它。这会将 java 堆栈跟踪打印到 logcat,但我没有看到 NDK 的任何堆栈跟踪。我已经用 ADB 重定向了 stdio,但我仍然没有看到堆栈跟踪。如何将 C++ 堆栈跟踪打印到 logcat 或打印在哪里? 使用安卓 2.3.4 NDK r8b
【问题讨论】:
【参考方案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”用户无法向任意进程发送信号。根据具体发生的情况,您应该能够在“强制关闭”对话框仍在屏幕上时执行此操作......但是如果线程设法在没有停止进程的情况下崩溃,那么可能没有堆栈可以获取一个痕迹。
【讨论】:
我得到“无法杀死 pid 26646:不允许操作” 我忘了注意您需要一个根设备(答案已更新)。【参考方案2】:可以使用以下代码获取Log
__android_log_print(ANDROID_LOG_ERROR, "TRACKERS", "%s", Str);
并添加以下库
#include <android/log.h>
【讨论】:
这不会打印堆栈跟踪。 您不能在 NDK 中打印堆栈跟踪,而是可以在 NDK 中未提供但仅提供登录的日志中打印日志 如果您无法打印堆栈跟踪,那么将 ndk-stack 之类的工具包含在 sdk 中将毫无意义。【参考方案3】:有一个工具叫CheckJNI,设置它的教程是there。
【讨论】:
以上是关于找不到 android NDK 堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章
Android NDK,错误:(165, 0) 原因:找不到 ndk-build 二进制文件