调试原生崩溃
如果您难以理解原生崩溃转储或墓碑,调试原生 Android 平台代码 是一个不错的入门介绍。
有关常见崩溃类型的完整目录以及如何调查这些崩溃,请参阅诊断原生崩溃。
该ndk-stack工具可以帮助您对崩溃进行符号化。您可以在 Android Studio 中调试崩溃,如通用调试您的应用文档中所述。如果您更喜欢使用命令行,ndk-gdb允许您从 shell 中附加gdb
或lldb
。
为应用提供对墓碑跟踪的直接访问权限
从 Android 12(API 级别 31)开始,您可以通过协议缓冲区访问应用的原生崩溃墓碑,方法是使用ApplicationExitInfo.getTraceInputStream()
方法。协议缓冲区使用此架构进行序列化。以前,获取此信息的唯一方法是通过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 支持mallinfo(3)和malloc_info(3)扩展到<malloc.h>
。
该malloc_info
功能在 Android 6.0(棉花糖)及更高版本中可用,其 XML 架构在 Bionic 的malloc.h头文件中进行了记录。
性能分析
对于原生代码的 CPU 性能分析,您可以使用Simpleperf。