内存泄露定位

什么是内存泄漏?

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或
无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

valgrid工具

(1) 简介:
Valgrind 是一套 Linux 下,开放源代码(GPL V2)的仿真调试工具的集合。Valgrind 由
内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),它模
拟了一个 CPU 环境,并提供服务给其他工具;而其他工具则类似于插件 (plug-in),利用内
核提供的服务完成各种特定的内存调试任务。最常用的工具为 Memcheck,用来检测程序中
出现的内存问题,所有对内存的读写都会被检测到,一切对 malloc()/free()/new/delete 的调用
都会被捕获。所以,它能检测以下问题:
• 对未初始化内存的使用;
• 读/写释放后的内存块;
• 读/写超出 malloc 分配的内存块;
• 读/写不适当的栈中内存块;
• 内存泄漏,指向一块内存的指针永远丢失;
• 不正确的 malloc/free 或 new/delete 匹配;
• memcpy()相关函数中的 dst 和 src 指针重叠。
(2) 使用示例:
valgrind --log-file=report.log --tool=memcheck --leak-check=full --show-leak-kinds=all ./benc
hmark arg1 arg2 …
(3) 输出日志解读:
• 报告中会指示出发生泄漏的函数和文件位置;
• 最后会给出一个总结,标明了泄漏的内存总量;
• definitely lost: 铁定丢失,一般来说存在明显的泄漏;
• indirectly lost: 间接丢失,当使用了含有指针成员的类或结构时可能会报这个错误;
• possibly lost: 可能丢失;
• 只能定位到内存最初被申请的位置,不能定位到是哪里泄漏

AddressSantizer

(1) 简介:
AddressSanitizer(ASan)是一个快速的内存错误检测工具。它包括一个编译器 instrumentation 模块和一个提供 malloc()/free()替代项的运行时库。
(2) 使用:
编译和链接选项中加入-fsanitize=address -fno-omit-frame-pointer 即可。可以通过 readelf 工具查看.so 的依赖库中是否包含 ASan 来确认编译是否成功。