使用Valgrind进行C++程序的内存泄露分析
安装Valgrind
sudo apt-get install valgrind
编译成debug版本的可执行程序
为了方便定位具体问题代码位置,首先是将自己的代码编译成debug版本的可执行程序,编译完成后可以验证下是否为debug版本,输入如下命令:
readelf -S your_program |grep debug
如果输出了debug字眼,则说明是debug版本,如果什么都没输出,则表示不是debug版本。
如下图:
注意,编译debug版本的时候不要用strip。
然后用valgrind执行自己编译的可执行程序,具体命令如下:
valgrind --tool=memcheck --leak-check=full --track-origins=yes --log-file=log ./your_program
–leak-check=full选项启用完全的泄露检查,
–track-origins=yes跟踪内存分配的来源,以便更准确地定位问题。
./your_program是你想要运行并检测内存泄露的程序。
–undef-value-errors=no:不检查未定义的值错误;
–log-file=log:将日志信息输出到 log 文件中;
注意,编译debug版本的时候不要用strip来去掉一些自己感觉没用的东西,在最终确定没有问题的时候,编译debug版时可以再去掉,我第一次编译debug版本的时候,就是用了strip,编出来的库只有17.8M,但是用了valgrind工具不能直接定位到出问题的代码行数,而是报了一个库的地址,,如下图所示,我尝试用addr2line命令还找不到具体的代码行数,addr2line的具体命令在文末。
最后编译debug版本的时候,没用strip,库的大小变为80M,再做内存泄露分析就会直接定位到问题代码行数了,如下图所示:
地址转为代码行
addr2line -e ./your_program -f 0x49B3B11
-e 后跟自己的文件名称
-f 会输出代码行数
0x49B3B11 表示具体的地址