Android C/C++ 内存泄漏分析 unreachable

💡 原文中文,约16500字,阅读约需40分钟。
📝

内容提要

本文介绍了淘宝内存专项中的一个工具——内存泄漏分析工具memunreachable的实现原理和淘宝对其改造用来支持Release包的方法。同时,介绍了该工具的核心函数CaptureThreads和CaptureThreadInfo。

🎯

关键要点

  • 随着客户端稳定性质量的提升,内存质量成为影响客户端质量的重要问题。
  • 内存泄漏是指动态分配的堆内存未被释放,导致内存浪费和程序崩溃。
  • libmemunreachable是一个零开销的内存泄漏检测器,使用不精确的垃圾回收算法来检测内存泄漏。
  • libmemunreachable的核心函数包括CaptureThreads和CaptureThreadInfo。
  • CaptureThreads通过ptrace获取线程信息,确保目标进程的状态不被破坏。
  • CaptureThreadInfo获取寄存器信息,以避免将被寄存器持有的内存误判为泄漏。
  • ProcessMappings解析进程的内存映射信息,帮助识别内存区域。
  • CollectAllocations将内存映射信息分类为堆、栈、全局和匿名映射,以便进行内存泄漏检测。
  • GetUnreachableMemory结合可达性算法分析可能的内存泄漏。
  • 淘宝对libmemunreachable进行了改造,以支持Release包的内存泄漏检测。
  • 改造包括获取/proc/self/maps而非/proc/pid/maps,以解决权限问题。
  • 修复ptrace失败的问题,通过设置prctl来允许attach操作。
  • 工程化改造使得泄漏数据能够上报到EMAS。
  • 可能的误报场景包括基于偏移量的内存引用导致的误判。
➡️

继续阅读