【内存泄漏】方法三:利用linux的valgrind命令定位内存泄露(Memory Leak)

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

清单 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

清单 2

  • 左边显示类似行号的数字(32372)表示的是 Process ID。
  • 最上面的红色方框表示的是 valgrind 的版本信息。
  • 中间的红色方框表示 valgrind 通过运行被测试程序,发现的内存问题。通过阅读这些信息,可以发现:
    1. 这是一个对内存的非法写操作,非法写操作的内存是4 bytes。
    2. 发生错误时的函数堆栈,以及具体的源代码行号。
    3. 非法写操作的具体地址空间。
  • 最下面的红色方框是对发现的内存问题和内存泄露问题的总结。内存泄露的大小(40 bytes)也能够被检测出来。

示例程序显然有两个问题,一是fun函数中动态申请的堆内存没有释放;二是对堆内存的访问越界。这两个问题均被valgrind发现。

posted @ 2020-08-20 18:14  _小百  阅读(1081)  评论(0编辑  收藏  举报