调试原生崩溃
如果您难以理解原生崩溃转储或 Tombstone 文件,请参阅调试原生 Android 平台代码,它是一篇不错的入门指南。
如需查看更全面的常见崩溃类型及其调查方法目录,请参阅诊断原生崩溃。
ndk-stack 工具可帮助符号化您的崩溃。如需了解如何在 Android Studio 中调试崩溃,请参阅常规的调试您的应用文档。如果您倾向于使用命令行,则可以使用 ndk-gdb 从 shell 连接 gdb
或 lldb
。
让应用直接访问 Tombstone 轨迹
从 Android 12(API 级别 31)开始,您可以通过 ApplicationExitInfo.getTraceInputStream()
方法以 协议缓冲区的形式访问应用的原生崩溃 Tombstone 文件。协议缓冲区使用此架构进行序列化。此前,获取此信息的唯一方式是通过 Android 调试桥 (adb)。
以下是关于如何在应用中实现此功能的示例
ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for (ApplicationExitInfo aei: exitReasons) {
if (aei.getReason() == REASON_CRASH_NATIVE) {
// Get the tombstone input stream.
InputStream trace = aei.getTraceInputStream();
// The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
Tombstone tombstone = Tombstone.parseFrom(trace);
}
}
调试原生内存问题
Address Sanitizer (HWASan/ASan)
HWAddress Sanitizer (HWASan) 和 Address Sanitizer (ASan) 与 Valgrind 类似,但在 Android 上的速度明显更快且支持力度更好。
它们是您在 Android 上调试内存错误的最佳选择。
Malloc 调试
请参阅 Malloc Debug 和 使用 libc 回调进行原生内存跟踪,详细了解 C 库用于调试原生内存问题的内置选项。
Malloc 钩子
如果您想构建自己的工具,Android 的 libc 也支持拦截程序执行期间发生的所有分配/释放调用。如需了解使用说明,请参阅 malloc_hooks 文档。
Malloc 统计信息
Android 支持对 <malloc.h>
的 mallinfo(3) 和 malloc_info(3) 扩展。
malloc_info
功能在 Android 6.0 (Marshmallow) 及更高版本中提供,其 XML 架构记录在 Bionic 的 malloc.h 头文件中。
性能分析
对于原生代码的 CPU 性能分析,您可以使用 Simpleperf。