Linux下检测内存泄露的工具 valgrind

简介: 参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html 几乎是照抄参考过来的,只不过后面自己调试一下代码。   这里主要介绍Valgrind的一些简单用法。

参考:http://www.cnblogs.com/sunyubo/archive/2010/05/05/2282170.html

几乎是照抄参考过来的,只不过后面自己调试一下代码。

 

这里主要介绍Valgrind的一些简单用法更多详细的使用方法可以访问valgrind的主页:http://www.valgrind.org

Valgrind是Julian Seward的作品。Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核,一个软件合成的CPU,和一系列的小工具。

每个工具都可以完成一项任务—调试分析或测试等。

Valgrind可以检测内存泄漏和内存违例。还可以分析cache的使用,灵活又强大,值得入手。

 

一、Valgrind概述

它主要有下列几个工具。

1.Memcheck

最常用的,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc和free的调用都会被捕获,所以它能检测下列问题:

1)对为初始化内存的使用

2)读/写释放后的内存块

3)读/写超出malloc分配的内存块

4)读/写不适当的栈中的内存块

5)内存泄漏,指向一块内存的指针永远丢失

6)不正确的malloc/free或new/delete匹配

7)memcpy相关函数中的dst和src指针重叠

 

2.Callgrind

和gprof类似的分析工具,但它对程序的运行观察更细致入微,能给我们提供更多的信息。和gprof不同,它不需要在编译源代码时添加附加特殊选项,但加上调试选项是推荐的。

Callgrind收集程序运行时的一些数据,建立函数调用关系图,还可以有选择的进行cache模拟。在运行结束时,它会把分析数据写入一个文件,callgrind_annotate可以把这个文件的内容转化成可读的形式。

 

3.Cachegrind

Cache分析器,它模拟CPU中的一级缓存I1,DI和二级缓存,能够精确的指出程序中cache的丢失和命中。

如果需要,它还能为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块整个程序产生的指令数,这对优化程序有很大的帮助。

 

4.Helgrind

用来检测多线程程序中出现的竞争问题。Helgrind寻找内存中内对个线程访问,而又没有一贯加锁的区域。这些区域往往是线程之间失去同步的情况,而且会导致难以发掘的错误。

Helgrind实现了名为“Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。不过Helgrinf仍然处于实验阶段。

 

5.Massif

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在代用虚拟内存的现代系统中,它还能加速我们程序的运行,减少程序停留在交换区中的几率。

 

此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。

 

二、使用Valgrind

先安装,我的服务器上已经安装好了,不知道是不是所有的linux都自带这个东西。

  

命令格式如下:

valgrind [valgtind-options] your-prog [your-prog options]

比如:

-h  显示帮助信息

--version 显示内核版本信息(我也不知道为啥不是-v)

-q 安静的运行,只打印错误信息

-tool=[default:memcheck]  最常用的选项,后面接工具名。如果省略工具名,默认运行memcheck

 

比如下面的程序:

#include<stdio.h>

#include<stdlib.h>

void fun()

{

         int *x = malloc(10 * sizeof(int));

         x[10] = 0;

}

int main()

{

         int i = 99;

         fun();

         printf("i = %d\n", i);

         return 0;

}

存在两个问题:

1)没有free掉申请的资源

2)fun函数里面越界了,x[10]是非法的

 

下面演示如何使用valgrind中的memcheck:

调用时还可以加上tool:  $valgrind –tool=memcheck ./malloc

 

==28308== 中的28308表示程序运行时的进程号。

Invalid write of size 4:表示非法写入,下面是告诉我们错误发生的位置,在main中调用的fun函数。

HEAP SUMMARY:说明了堆的情况,可以看到申请了40个字节,后面说有1个申请,0个被free。

LEAK SUMMARY:也是说的堆的泄漏情况,明显丢失的有40个字节。

如果main中的i没有赋值,这里还会有一些其他的错误,具体可以自己试一下。这个需要运用到实际项目中才能更加理解。

 

下面就是i没有赋值的错误信息截取了部分:

 

 

下面介绍一些其他用法(我也是照着参考学的,具体如何用到实际项目中还需要自己领悟):

测试下面时,main函数中的i我改为了没有赋值:

1.一旦出现错误,valgrind会自动启动调试器(一般是gdb):

 

 

2.下面来试试callgrind:

 

可以看到生成了一个文件(绿色框框)。当callgrind运行你的程序时,还可以使用callgrind_control来观察程序的执行,而且不会干扰它的运行:

下面显示如何查看详细信息:

 

 

3.再来试试cachegrind:

 

上面是指令缓存,I1和L2i缓存的访问信息,包括总的访问次数,丢失次数,丢失率。

中间是数据缓存,D1和L2d缓存的访问相关信息。

下面是L2缓存单独的信息。

也有一个输出文件,cachegrind.out.25843,可以用cg_annotate 来查看。显示出详细的列表。

 

4.missif的使用

跟cachegrind类似,只不过生成的文件不一样,生成的是massif.pid.ps的PostScript文件,里面只有一副描述堆栈使用情况的彩图。

 

目录
相关文章
|
2月前
|
安全 Linux Shell
四、Linux核心工具:Vim, 文件链接与SSH
要想在Linux世界里游刃有余,光会“走路”还不够,还得配上几样“高级装备”。首先是Vim编辑器,它像一把瑞士军刀,让你能在命令行里高效地修改文件。然后要懂“软硬链接”,软链接像个快捷方式,硬链接则是给文件起了个别名。最后,SSH是你的“传送门”,不仅能让你安全地远程登录服务器,还能用scp轻松传输文件,设置好密钥更能实现免-密登录,极大提升效率。
336 3
|
2月前
|
安全 Linux iOS开发
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
160 0
SonarQube Server 2025 Release 5 (macOS, Linux, Windows) - 代码质量、安全与静态分析工具
|
2月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
222 16
|
3月前
|
数据采集 编解码 运维
一文讲完说懂 WowKey -- WowKey 是一款 Linux 类设备的命令行(CLT)运维工具
WowKey 是一款面向 Linux 类设备的命令行运维工具,支持自动登录、批量执行及标准化维护,适用于企业、团队或个人管理多台设备,显著提升运维效率与质量。
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1423 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
414 1
|
4月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
396 0
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
888 0
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。

热门文章

最新文章