调试原生内存使用问题

Address Sanitizer (HWASan/ASan)

Android 平台开发者使用 HWAddressSanitizer (HWASan) 在 C/C++ 中查找内存错误。

您可以通过 ci.android.com,将预构建的 HWASan 映像刷写到支持的 Pixel 设备上(详细设置说明)。

自 Android 8.0 (Oreo) 开始,您可以使用 ASan 在未取得 root 权限的正式版设备上对应用进行调试。您可以在 ASan wiki 上找到相关说明。

Heapprofd

Android 10 支持 happrofd,它是一种低开销的采样堆分析器。您可以通过 heapprod 将原生内存使用率归因于程序中的调用堆栈。 如需了解详情,请参阅 Perfetto 文档网站上的 heapprofd - Android 堆分析器

Malloc 调试

有关本地内存问题可用调试选项的完整说明,请参阅 Malloc 调试使用 libc 回调跟踪本地内存

libmemunreachable

Android 的 libmemunreachable 是一个零开销的本地内存泄漏检测器。 它会使用不精确的“标记-清除”垃圾回收器遍历所有本机内存,同时将任何不可访问的块报告为泄漏。有关使用说明,请参阅 libmemunacachable 文档

Malloc 钩子

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

Malloc 统计信息

Android 支持 <malloc.h>mallinfo(3)malloc_info(3) 扩展。 Android 6.0 (Marshmallow) 及更高版本提供 malloc_info 函数,其 XML 架构记录在 Bionic 的 <malloc.h> 中。

Dalvik 调试监控服务器

您还可以使用 Dalvik 调试监控服务器 (DDMS) 获取“malloc 调试”输出的图形视图。

要使用 DDMS,请先打开其本机内存界面:

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

重新启动 DDMS 并选择一个进程后,您可以切换到新的本地分配选项卡,并使用分配列表进行填充。这对于调试内存泄漏尤为有用。