valgrind

一、官网地址

当前的最新的release版本是3.22.0
https://valgrind.org/

二、安装

一般的linux系统源都包含,可以联网安装
# sudo yum install valgrind -y
# sudo apt install valgrind -y

或者源码安装
wget https://sourceware.org/pub/valgrind/valgrind-3.22.0.tar.bz2 --no-check-certificate
tar -jxvf valgrind-3.22.0.tar.bz2
./configure
make -j 8
make install

三、工具说明

valgrind目前有7个常用的工具,这是我们主要选择的参数内容

Memcheck - 检查内存管理问题,主要针对C/C++程序。 当程序运行在Memcheck监控模式下,所有内存的读写都会被检查,并且对malloc/new/free/delete的调用都会被截获,因此Memcheck可以发现程序是否存在
* 不合理的内存访问(Accesses memory it shouldn't : areas not yet allocated, areas that have been freed, areas past the end of heap blocks, inaccessible areas of the stack).
* 使用未初始化的内存(Uses uninitialised values in dangerous ways).
* 内存泄露(Leaks memory).
* 错误释放堆内存Does bad frees of heap blocks (double frees, mismatched frees).
* 重叠的内存拷贝范围(Passes overlapping source and destination memory blocks to memcpy() and related functions).

Cachegrind - Cachegrind是一个缓存分析工具。它模拟 CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中 cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。对任何语言写的程序都很有帮助。Cachegrind执行程序速度会比正常速度慢10-30倍。

Callgrind - 由Josef Weidendorfer创建,是Cachegrind的一个扩展。它提供了所有Cachegrind包含的信息,额外包含调用关系(callgraphs)。这个工具是在3.2.0发布版本合入。还有一个非常哇塞的可视化工具分支,KCachegrind,支持对Callgrind获取的数据以更加优雅的方式展示。当然也可以用于展示Cachegrind获取的数据。

Massif - 堆栈分析器,通过对程序堆做快照进行详细的堆数据分析。可以提供一个随时间展示的图形化堆使用数据,包含程序的那些部分申请了最多的堆内存信息。Massif比普通速度慢20倍的速度执行程序。

Helgrind - 它主要用来检查多线程程序中出现的数据竞争问题。Helgrind 寻找内存中被多个线程(POSIX p-)访问,而又没有一致加锁的区域(pthread_mutex_),这些区域往往是线程之间失去同步的地方,而且会导致难以发现的依赖长时间运行才会出现的错误。

DRD - C/C++多线程程序错误检查工具。相比Helgring占用更小的内存。

DHAT - 程序堆内存申请使用检测工具。它跟踪申请的堆块,并发现每次每次内存访问的block。提供一个GUI界面展示分析结果。

memcheck是默认执行的工具

四、常用参数说明

--trace-children=[no/yes] ,是否跟踪子进程,默认是no。如果程序运行后会拉起子进程,此处需要打开才能完整捕获所有进程状态
--error-limit=no|yes ,当发现的错误数达到一定数量时是否停止跟踪,模式是yes。如果想持续跟踪程序运行状态,需要设置关闭
--leak-check=no|summary|full,检查内存泄露,默认是概要模式(summary),设置为full会更详细
--show-reachable=yes,显示所有内存泄露类型,等同于--show-leak-kinds=all

五、使用

参考cnblog上的实例代码,做一个越界访问和内存泄露的示例

gcc -Wall -g -o valgrind_test valgrind_test.c

执行内存检查

valgrind --tool=memcheck --leak-check=full ./valgrind_test

执行callgrind检查

valgrind --tool=callgrind --leak-check=full ./valgrind_test

执行完会输出1个类似callgrind.out.286187的文件,用callgrind_annotate callgrind.out.286187查看结果

如果被测试的程序是驻留服务,不会停止呢,我们给上面的main里面添加1个while死循环,然后重新执行valgrind,这时候默认产生的out文件里面是空的,如果想查看统计信息,一个方法是使用ctrl+c结束进程,如果是驻留服务kill -s SIGINT 638611结束进程也可以生成out,这种方式会结束当前进程。

另外一种方式是用callgrind_control dump出来1个分析文件,然后用callgrind_annotate进行分析,例如(336052是valgrind的进程id)

callgrind_control --dump 336052

六:参考链接

https://www.cnblogs.com/Hi-blog/p/Memory-Check-Tools.html

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据