Valgrind 安装
命令: sudo apt-get install valgrind
转载于:https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html
Valgrind 使用
第一步:准备好程序
为了使valgrind发现的错误更精确,如能够定位到源代码行,建议在编译时加上-g参数,编译优化选项请选择O0,虽然这会降低程序的执行效率。
这里用到的示例程序文件名为:sample.c(如下所示),选用的编译器为gcc。
生成可执行程序 gcc –g –O0 sample.c –o sample
清单 1
第二步:在valgrind下,运行可执行程序。
利用valgrind调试内存问题,不需要重新编译源程序,它的输入就是二进制的可执行程序。调用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]
Valgrind 的参数分为两类,一类是 core 的参数,它对所有的工具都适用;另外一类就是具体某个工具如 memcheck 的参数。Valgrind 默认的工具就是 memcheck,也可以通过“--tool=tool name”指定其他的工具。Valgrind 提供了大量的参数满足你特定的调试需求,具体可参考其用户手册。
这个例子将使用 memcheck,于是可以输入命令入下:valgrind <Path>/sample.
第三步:分析 valgrind 的输出信息。
以下是运行上述命令后的输出。
清单 2
- 左边显示类似行号的数字(32372)表示的是 Process ID。
- 最上面的红色方框表示的是 valgrind 的版本信息。
- 中间的红色方框表示 valgrind 通过运行被测试程序,发现的内存问题。通过阅读这些信息,可以发现:
- 这是一个对内存的非法写操作,非法写操作的内存是4 bytes。
- 发生错误时的函数堆栈,以及具体的源代码行号。
- 非法写操作的具体地址空间。
- 最下面的红色方框是对发现的内存问题和内存泄露问题的总结。内存泄露的大小(40 bytes)也能够被检测出来。
示例程序显然有两个问题,一是fun函数中动态申请的堆内存没有释放;二是对堆内存的访问越界。这两个问题均被valgrind发现。