Address Sanitizer:HWASan/ASan
Android 平台开发者使用 HWAddressSanitizer (HWASan) 来查找 C/C++ 中的内存错误。
您可以从 ci.android.com(详细设置说明)将预构建的 HWASan 映像刷写到受支持的 Pixel 设备。
自 Android 8.0 (Oreo) 起,也可以在非 root 生产设备上使用 ASan 调试应用。您可以在 ASan Wiki 上找到相关说明。Heapprofd
Android 10 支持 heapprofd,这是一款低开销的采样堆分析器。heapprofd 可让您将原生内存用量归因于程序中的调用堆栈。如需了解详情,请参阅 heapprofd - Android 堆分析器(位于 Perfetto 文档网站)。
Malloc 调试
请参阅 Malloc 调试 和 使用 libc 回调的原生内存跟踪,以详细了解可用于原生内存问题调试的选项。
libmemunreachable
Android 的 libmemunreachable 是一款零开销原生内存泄漏检测器。它会对所有原生内存执行不精确的标记和清除垃圾回收传递,并将任何无法访问的块报告为泄漏。有关使用说明,请参阅 libmemunreachable 文档。
Malloc 钩子
如果您想构建自己的工具,Android 的 libc 也支持拦截程序执行期间发生的所有分配/释放调用。有关使用说明,请参阅 malloc_hooks 文档。
Malloc 统计信息
Android 支持 mallinfo(3)
和 malloc_info(3)
扩展程序(适用于 <malloc.h>
)。malloc_info
函数在 Android 6.0 (Marshmallow) 及更高版本中可用,其 XML 架构记录在 Bionic 的 <malloc.h>
中。
Dalvik Debug Monitor Server
您还可以使用 Dalvik Debug Monitor Server (DDMS) 获取 Malloc 调试输出的图形视图。
要使用 DDMS,请先开启其原生内存界面
- 打开
~/.android/ddms.cfg
- 添加以下行:
native=true
重新启动 DDMS 并选择进程后,您可以切换到新的原生分配标签页,并使用分配列表填充该标签页。这对于调试内存泄漏尤其有用。