1. 使用Valgrind的Memcheck工具
Valgrind是Ubuntu下最经典的内存泄漏检测工具,其memcheck组件可深度分析程序的内存分配/释放行为。触发检测的步骤如下:
sudo apt install valgrind安装;-g选项生成调试信息(如gcc -g -o myprogram myprogram.c),调试信息是Valgrind定位泄漏位置的关键;valgrind --leak-check=full ./myprogram,--leak-check=full选项会输出详细的泄漏报告(包括泄漏内存的大小、位置及调用栈)。2. 使用AddressSanitizer(ASan)
AddressSanitizer是GCC/Clang内置的高性能内存错误检测器,支持内存泄漏、越界访问等多种错误检测。触发检测的方式为:
-fsanitize=address(如g++ -fsanitize=address -g -o myprogram myprogram.cpp);./myprogram),ASan会在程序退出时自动检测并输出内存泄漏信息(如泄漏的内存地址、分配调用栈)。3. 使用LeakSanitizer(LSan)
LeakSanitizer是ASan的子模块,专门针对内存泄漏设计,可与ASan联合使用或单独启用。触发检测的步骤与ASan类似:
-fsanitize=leak(如gcc -fsanitize=leak -g -o myprogram myprogram.c);4. 使用mtrace工具(GNU C库内置)
mtrace是GNU C库提供的轻量级内存跟踪工具,适合简单的泄漏检测场景。触发检测的流程为:
<mcheck.h>头文件,并调用mtrace()函数开启跟踪(如#include <mcheck.h>; int main() { mtrace(); ... });export MALLOC_TRACE=./trace.log指定日志文件路径;mtrace ./myprogram $MALLOC_TRACE命令解析日志,输出未释放的内存分配信息(如地址、大小、调用位置)。5. 使用eBPF工具memleak(适用于生产环境)
memleak是基于eBPF的实时内存泄漏检测工具,无需修改代码即可监控进程的内存分配情况,适合生产环境。触发检测的步骤如下:
sudo apt install bpfcc-tools安装(包含memleak工具);sudo /usr/share/bcc/tools/memleak -p $(pidof your_program)(-p参数指定目标进程的PID),工具会实时输出未释放的内存分配调用栈。注意事项
malloc/free系列函数分配的内存,无法覆盖C++的new/delete;