Linux检测内存泄漏

安装valgrind

1、可以用命令安装:

sudo apt-get install valgrind

2、源码安装
到官网下载最新版:https://sourceware.org/pub/valgrind/valgrind-3.15.0.tar.bz2
下载之后解压:tar -jxvf valgrind-3.15.0.tar.bz2.tar.bz2
解压之后进入解压出来的目录:cd valgrind-3.15.0
执行:sudo ./configure
接着:sudo make
然后:sudo make install
安装完了之后,安装完之后执行:valgrind --version看版本是否正确
在这里插入图片描述

检查程序

编译程序的时候使用-g选项:gcc main.c -o main -g
执行valgrind -v --log-file=valgrind.log --tool=memcheck --leak-check=yes --show-reachable=yes ./a.out
将信息打印到valgrind.log中,查看log中的内容找到如图的地方:
在这里插入图片描述
可以看到有确定泄漏、间接泄漏、可能泄漏,还有直接定位到了泄露在那个文件中的第几行。解决泄漏之后,再执行上面的命令,可以看到如下:
在这里插入图片描述
没有发生内存泄露的地方了。

关于valgrind

Valgrind有多个工具,包括Memcheck、Cachegrind、Callgrind、Helgrind、DRD、Massif、DHAT、SGCheck、BBV:
1、Memcheck:主要检查的程序错误包括,(1)、使用未初始化的内存;(2)、读写已经释放了的内存;(3)、使用超过malloc分配的内存空间;(4)、对堆栈的非法访问;(5)、申请的空间是否有释;(6)malloc/free/new/delete申请和释放内存的匹配;(7)、src和dst指针的重叠;(8)、将无意义的参数传递给系统调用。
2、Cachegrind:它是一个cache剖析器,它模拟CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码、每个函数、每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。
3、Callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
4、Helgrind:它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为”Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。
5、DRD:用于分析多线程,与Helgrind类似,但是用不同的分析技术,可用检测不同的问题。
6、Massif:堆栈分析器,它能够测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
7、DHAT:另一个堆检测工具,帮助了解代码段的生命周期、利用率、效率规划。
8、SGCheck:检测栈和全局数组溢出的实验性工具,与Memcheck互补使用。
9、BBV:通过SimPoint分析工具产生基本块向量。

valgrind [options] prog-and-args

常用选项说明:
(1)、–help:显示帮助信息;
(2)、–version:显示valgrind版本;
(3)、–tool=:运行valgrind中名为toolname的工具,默认memcheck,还可以为cachegrid、drd、lackey、callgrind、helgrind、massif等;
(4)、–quiet:安静地运行,只打印错误信息;
(5)、–verbose:更详细的信息,增加错误数统计;
(6)、–trace-childer=no|yes:跟踪子线程;
(7)、–track-fds=no|yes:跟踪打开的文件描述;
(8)、–time-stamp=no|yes:增加时间戳到Log信息;
(9)、–log-fd=:输出Log信息到文件描述符;
(10)、–log-file=:输出Log信息到指定的文件;
(11)、–xml=yes:将错误信息以xml格式输出,只有memcheck可用;
(12)、–xml-file=:XML输出到指定文件;
(13)、–error-limit=no|yes:如果错误太多,则停止显示新错误;
(14)、–error-exitcode=:如果发现错误,则返回错误代码;
(15)、–leak-check=no|summary|full:对发现的内存泄露给出的信息级别,只有memcheck可用。

参考:1、https://blog.csdn.net/fengbingchun/article/details/50196189
2、https://www.cnblogs.com/walker-lin/p/11451116.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值