调试项目

调试原生代码崩溃

如果您想要了解原生代码崩溃转储或 Tombstone,不妨阅读调试 Android 平台原生代码一文。

如需了解更多的常见崩溃类型及其调查方法,请参阅诊断原生代码崩溃问题

ndk-stack 工具可帮助您对崩溃问题进行符号化处理。您可以按照常规调试应用文档中的说明,在 Android Studio 中调试崩溃问题。如果您更喜欢使用命令行,可以使用 ndk-gdb 从 shell 附加 gdblldb

让应用能够直接访问 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 调试

有关 C 库内置的原生内存问题调试选项的完整说明,请参阅 Malloc 调试使用 libc 回调跟踪原生内存

Malloc 钩子

如果您想构建自己的工具,Android 的 libc 也支持拦截在程序执行期间发生的所有分配/释放调用。有关使用说明,请参阅 malloc_hooks 文档

Malloc 统计信息

Android 支持 <malloc.h>mallinfo(3)malloc_info(3) 扩展。

Android 6.0 (Marshmallow) 及更高版本提供 malloc_info 功能,Bionic 的 malloc.h 头文件中记录了其 XML 架构。

性能分析

如需对原生代码进行 CPU 性能分析,请使用 Simpleperf