valgrind是一款强大的C++程序调试工具,可帮助我们检测程序中的内存泄露、死锁等,valgrind的安装比较简单。下载了valgrind后,在linux系统中输入下列命令:
1 2 3 4 5 6 7 | $ sudo apt-get install automake $ tar jxf valgrind-3.16.1.tar.bz2 $ cd valgrind-3.16.1 $ ./autogen.sh $ ./configure $ make $ sudo make install |
期间可能遇到的问题:
1、如果输入./autogen.sh后出现拒绝访问的问题
这个问题大部分人不会遇到,如果遇到autogen.sh文件拒绝访问,即使我们切换到管理员权限下也还是无法访问,那我们直接修改文件权限即可。
1 | $chmod 777 autogen.sh |
2、在执行./autogen.sh命令时遇到aclocal: command not found error while running aclocal
出现这个问题主要是没有在执行./autogen.sh之前安装automake,在终端中输入sudo apt-get install automake即可。
上述主要是valgrind的安装过程,可以看出,整个过程还是比较简单的,下面我们用valgrind来调试一个简单的内存泄露程序,如下,我们编写一个简单的内存泄露程序,稍微学过点C++的人都知道这个程序存在内存泄露的问题。
1 2 3 4 5 6 7 8 | #include <stdlib.h> // // int main(void) { int*a=(int*)malloc(10*sizeof(int)); return 0; } |
接着在终端输入gcc main.cpp生成a.out文件,输入valgrind ./a.out来测试是否有内存泄露事件发生。终端输出如下结果:
从上图中我们可以看到,终端中输出a memory error detector以及total heap usage:1 allocs, 0 frees。因此可以判断我们的程序发生了内存泄露,那么如果我们的代码很长,我们仅仅知道存在内存泄露是不够的,我们希望知道程序中到底哪行代码导致了内存泄露。在终端中输入如下命令:
1 2 | $g++ -g main.cpp $valgrind --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out |
执行上述命令后,我们看到终端输出如下结果,从结果中可以看到main.cpp中第6行导致了内存泄露。