valgrind 使用
安装
1. 下载源码
去下载页面下载最新的源码。
$ wget https://sourceware.org/pub/valgrind/valgrind-3.17.0.tar.bz2
$ tar xf valgrind-3.17.0.tar.bz2
2. 编译安装
下载了源码之后,就可以编译安装了,编译和安装大约需要消耗 10 分钟。
$ cd valgrind-3.17.0
$ ./configure --prefix=/home/wy/valgrind # 修改你需要安装的路径
$ make
$ make install
3. 修改环境变量
安装完成后,在你前面指定的路径目录中,会有如下目录:
├── bin
├── include
├── lib
├── libexec
└── share
可在你的 .bashrc 中设置环境变量:
export PATH=$PATH:/home/wy/valgrind/bin
export VALGRIND_LIB=/home/wy/valgrind/libexec/valgrind
使其生效:
$ source ~/.bashrc
至此就安装完成了。
内存异常检测和内存泄露检测
valgrind 功能很强大,它能检测对内存的非法使用,比如读取未初始化内存,访问内存越界等等,还能检测内存泄露。使用 valgrind 来检测内存相关问题时,必须要使用 C/C++ 标准库中的内存分配函数。因为 valgrind 会在内存分配和释放的函数中嵌入额外的逻辑来实现内存的检查。
使用方法很简单,首先去官网下载源码,然后解压、编译、配置环境变量即可:
$ wget https://sourceware.org/pub/valgrind/valgrind-3.17.0.tar.bz2
$ tar -jxvf valgrind-3.17.0.tar.bz2
$ ./configure --prefix=~/valgrind # --prifix 是指定安装路径,根据自己需要而定
$ make
$ make install
$ echo "export PATH=$PATH:~/valgrind/bin/" >> ~/.bashrc
$ source ~/.bashrc
使用的时候,只需要在你的命令前面加上 valgrind 和 valgrind 的选项即可:
$ valgrind --tool=memcheck --leak-check=yes ./a.out
当你的程序在执行过程中有对内存异常的操作,就会得到报告,在程序执行完毕后,会得到当前没有释放的内存的汇总信息,这些内存中可能就是泄露的内存。
可以参考文档学习关于 valigrind 的更多用法。
分析性能瓶颈
使用 valgrind 可以记录函数调用关系,还能得到各行代码的运行次数。它的用法很简单,指定 valgrind 的 tool 为 callgrind,然后运行程序:
$ valgrind --tool=callgrind a.out
程序运行完成后,会产生一个形如 callgrind.out.8344 的文件,这里 8344 是刚刚运行的程序对应的进程号,这个文件一样是没法直接打开的,需要使用工具来转换成可读的文本文件:
$ callgrind_annotate --auto=yes --inclusive=yes callgrind.out.8344 > 8344.txt
在这个文件里面,可以看到各个函数执行的指令的占比,这里主函数 main 一定是接近 100% 的,这与 gprof 的结果不同,gprof 在对函数排序的时候是只统计本函数的耗时,不考虑调用的子函数的耗时。另外 valgrind 的统计结果中可以看到每一行代码的执行次数,这对优化程序性能有很大帮助。