调试原生内存使用情况

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,请先开启其原生内存界面

  1. 打开 ~/.android/ddms.cfg
  2. 添加以下行:native=true

重新启动 DDMS 并选择进程后,您可以切换到新的原生分配标签页,并使用分配列表填充该标签页。这对于调试内存泄漏尤其有用。