一 、valgrind简介
最近在Linux下程序碰到了内存泄漏的问题,所以在网上找了找Linux下的内存泄漏检测工具,找到了Valgrind这款功能很强大的内存调试、内存泄漏检测以及性能分析、检测线程错误的软件开发工具。
Valgrind 是运行在Linux 上的多用途代码剖析和内存调试软件。主要包括Memcheck、Callgrind、Cachegrind 等工具,每个工具都能完成一项任务调试、检测或分析。可以检测内存泄露、线程违例和Cache 的使用等。Valgrind 基于仿真方式对程序进行调试,它先于应用程序获取实际处理器的控制权,并在实际处理器的基础上仿真一个虚拟处理器,并使应用程序运行于这个虚拟处理器之上,从而对应用程序的运行进行监视。应用程序并不知道该处理器是虚拟的还是实际的,已经编译成二进制代码的应用程序并不用重新进行编译,Valgrind 直接解释二进制代码使得应用程序基于它运行,从而能够检查内存操作时可能出现的错误。所以在Valgrind下运行的程序运行速度要慢得多,而且使用的内存要多得多 - 例如,Memcheck工具下的程序是正常情况的两倍多。因此,最好在性能好的机器上使用Valgrind。
二、安装valgrind
百度网盘:链接: https://pan.baidu.com/s/1_dk-lkjdwLw7GV26XlW3Rg 提取码: ex32
下载好后,随便放到一个文件夹里,使用如下命令解压:
tar -xjvf valgrind-3.15.0.tar.bz2
然后进入到解压后的文件夹中:cd valgrind-3.15.0/
因为valgrind支持多个平台,根据当前主机配置valgrind:
./configure
./configure之后就有makefile出现,接着就是make编译,安装:
make
sudo make install
安装完后查看一下版本看看是否安装好:
valgrind --version
三、使用valgrind
在编译你自己的程序的时候,加上-g以包含调试信息,以便Memcheck的错误消息包含确切的行号。例如:
gcc -g valgrind_test.c -o valgrind_test
Memcheck是默认工具。--leak-check 选项打开详细的内存泄漏检测器。程序运行速度会比正常情况慢很多,并且会占用更多内存。Memcheck将发出有关内存错误和检测到的泄漏的消息。正常运行可执行程序只需要./+可执行程序就可以了,如:./valgrind_test 。使用valgrind运行可执行程序,使用如下命令:
valgrind --leak-check=yes ./valgrind_test
程序运行起来后,valgrind就会记录内存的使用情况,当程序结束后,如果有没有释放的内存,valgrind就会把这些内存泄漏的地方打印出来。
打印的有堆区的使用情况,以及内存泄漏的消息。有几种泄漏,两个最重要的类别是:肯定泄露(definitely lost),可能已经泄露(possibly lost)。
关于Memcheck的错误消息说明:
http://valgrind.org/docs/manual/mc-manual.html#mc-manual.errormsgs
四、Valgrind中包含的其他工具
1.Memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:
- 对未初始化内存的使用;
- 读/写释放后的内存块;
- 读/写超出malloc分配的内存块;
- 读/写不适当的栈中内存块;
- 内存泄漏,指向一块内存的指针永远丢失;
- 不正确的malloc/free或new/delete匹配;
- memcpy()相关函数中的dst和src指针重叠。
这些问题往往是C/C++程序员最头疼的问题,Memcheck在这里帮上了大忙。
2.Callgrind
和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。
3.Cachegrind
Cache分析器,它模拟CPU中的一级缓存I1,Dl和二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。
4.Helgrind
它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过,Helgrind仍然处于实验阶段。
5. Massif
堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
工具使用命令:
valgrind --tool=工具名 ./可执行文件名
参考博客:https://blog.csdn.net/caijiwyj/article/details/99188644#mc-manual.errormsgs

本文介绍了Valgrind这款强大的内存调试工具,包括其 Memcheck、Callgrind、Cachegrind等组件,详细讲解了安装步骤、如何使用Memcheck检测内存泄漏,并列举了其他工具的功能和应用场景。

2222

被折叠的 条评论
为什么被折叠?



