valgrind——Linux下内存泄漏检测工具

性能优化利器:深入探秘perf与Valgrind 本文介绍了两款强大的性能分析工具——perf和Valgrind,它们在识别程序性能瓶颈和内存问题方面各具特色。通过实际应用案例,我们学会了如何使用这些工具进行性能调优。结合使用perf和Valgrind,可以更全面地识别和解决性能问题,为软件开发中的性能优化提供了有力支持。 阅读详情

【引言】Valgrind的主要作者Julian Seward刚获得了2006年的Google-O’Reilly开源大奖之一──Best Tool Maker。让我们一起来看一下他的作品。Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀
一. Valgrind概观
它一般包含下列工具:
1.Memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:
1.对未初始化内存的使用;
2.读/写释放后的内存块;
3.读/写超出malloc分配的内存块;
4.读/写不适当的栈中内存块;
5.内存泄漏,指向一块内存的指针永远丢失;
6.不正确的malloc/free或new/delete匹配;
7,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能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。
此外,lackey和nulgrind也会提供。Lackey是小型工具,很少用到;Nulgrind只是为开发者展示如何创建一个工具。我们就不做介绍了。
二. 使用Valgrind
Valgrind的使用非常简单,valgrind命令的格式如下:
valgrind [valgrind-options] your-prog [your-prog options]
一些常用的选项如下:
选项
作用
-h –help
显示帮助信息。
–version
显示valgrind内核的版本,每个工具都有各自的版本。
-q –quiet
安静地运行,只打印错误信息。
-v –verbose
打印更详细的信息。
–tool= [default: memcheck]
最常用的选项。运行valgrind中名为toolname的工具。如果省略工具名,默认运行memcheck。
–db-attach= [default: no]
绑定到调试器上,便于调试错误。
我们通过例子看一下它的具体使用。我们构造一个存在内存泄漏的C程序,如下:

void f(void) 
{ 
int* x = malloc(10 * sizeof(int)); 
x[10] = 0; // problem 1: heap block overrun 
} // problem 2: memory leak -- x not freed 
int main(void) 
{ 
int i; 
f(); 
printf("i=%d/n",i); //problem 3: use uninitialised value. 
return 0; 
} 

保存为memleak.c并编译,然后用valgrind检测。
$ gcc -Wall -o memleak memleak.c
$ valgrind –tool=memcheck ./memleak
我们得到如下错误信息:
==3649== Invalid write of size 4
==3649== at 0x80483CF: f (in /home/wangcong/memleak)
==3649== by 0x80483EC: main (in /home/wangcong/memleak)
==3649== Address 0x4024050 is 0 bytes after a block of size 40 alloc’d
==3649== at 0x40051F9: malloc (vg_replace_malloc.c:149)
==3649== by 0x80483C5: f (in /home/wangcong/memleak)
==3649== by 0x80483EC: main (in /home/wangcong/memleak)
前面的3649是程序运行时的进程号。第一行是告诉我们错误类型,这里是非法写入。下面的是告诉我们错误发生的位置,在main()调用的f()函数中。
==3649== Use of uninitialised value of size 4
==3649== at 0xC3A264: _itoa_word (in /lib/libc-2.4.so)
==3649== by 0xC3E25C: vfprintf (in /lib/libc-2.4.so)
==3649== by 0xC442B6: printf (in /lib/libc-2.4.so)
==3649== by 0x80483FF: main (in /home/wangcong/memleak)
这个错误是使用未初始化的值,在main()调用的printf()函数中。这里的函数调用关系是通过堆栈跟踪的,所以有时会非常多,尤其是当你使用C++的STL时。其它一些错误都是由于把未初始化的值传递给libc函数而被检测到。在程序运行结束后,valgrind还给出了一个小的总结:
==3649== ERROR SUMMARY: 20 errors from 6 contexts (suppressed: 12 from 1)
==3649== malloc/free: in use at exit: 40 bytes in 1 blocks.
==3649== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.
==3649== For counts of detected errors, rerun with: -v
==3649== searching for pointers to 1 not-freed blocks.
==3649== checked 47,256 bytes.
==3649==
==3649== LEAK SUMMARY:
==3649== definitely lost: 40 bytes in 1 blocks.
==3649== possibly lost: 0 bytes in 0 blocks.
==3649== still reachable: 0 bytes in 0 blocks.
==3649== suppressed: 0 bytes in 0 blocks.
==3649== Use –leak-check=full to see details of leaked memory.
我们可以很清楚地看出,分配和释放了多少内存,有多少内存泄漏。这对我们查找内存泄漏十分方便。然后我们重新编译程序并绑定调试器:
gccWallggdbomemleakmemleak.c valgrind –db-attach=yes –tool=memcheck ./memleak
一出现错误,valgrind会自动启动调试器(一般是gdb):
==3893== —- Attach to debugger ? — [Return/N/n/Y/y/C/c] —- y
starting debugger
==3893== starting debugger with cmd: /usr/bin/gdb -nw /proc/3895/fd/1014 3895
退出gdb后我们又能回到valgrind继续执行程序。
还是用上面的程序,我们使用callgrind来分析一下它的效率:
valgrindtool=callgrind./memleakCallgrindcallgrind.out.pidcallgrindannotate callgrind_annotate callgrind.out.3949
详细的信息就列出来了。而且,当callgrind运行你的程序时,你还可以使用callgrind_control来观察程序的执行,而且不会干扰它的运行。
再来看一下cachegrind的表现:
$ valgrind –tool=cachegrind ./memleak
得到如下信息:
==4073== I refs: 147,500
==4073== I1 misses: 1,189
==4073== L2i misses: 679
==4073== I1 miss rate: 0.80%
==4073== L2i miss rate: 0.46%
==4073==
==4073== D refs: 61,920 (46,126 rd + 15,794 wr)
==4073== D1 misses: 1,759 ( 1,545 rd + 214 wr)
==4073== L2d misses: 1,241 ( 1,062 rd + 179 wr)
==4073== D1 miss rate: 2.8% ( 3.3% + 1.3% )
==4073== L2d miss rate: 2.0% ( 2.3% + 1.1% )
==4073==
==4073== L2 refs: 2,948 ( 2,734 rd + 214 wr)
==4073== L2 misses: 1,920 ( 1,741 rd + 179 wr)
==4073== L2 miss rate: 0.9% ( 0.8% + 1.1% )
上面的是指令缓存,I1和L2i缓存,的访问信息,包括总的访问次数,丢失次数,丢失率。
中间的是数据缓存,D1和L2d缓存,的访问的相关信息,下面的L2缓存单独的信息。Cachegrind也生成一个文件,名为cachegrind.out.pid,可以通过cg_annotate来读取。输出是一个更详细的列表。Massif的使用和cachegrind类似,不过它也会生成一个名为massif.pid.ps的PostScript文件,里面只有一幅描述堆栈使用状况的彩图。
以上只是简单的演示了valgrind的使用,更多的信息可以在它附带的文档中得到,也可以访问valgrind的主页:http://www.valgrind.org。学会正确合理地使用valgrind对于调试程序会有很大的帮助

linux下用valgrind做内存检查 用C/C++开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事情就好了,valgrind正好就是这样的一款工具。Valgrind是一款基于模拟linux下的程序调试器和剖析器的软件套件,可以运行于x86, amd64和ppc32架构上。valgrind包含一个核心,它提供一个虚拟的CPU运行程序,还有一 阅读详情

相关推荐

基于verilog的16QAM调制

思路1:正交调幅法——实现16QAM调制,可以理解为时相位相差90度的两个正弦波的4PAM叠加。 4比特输入经过2->4进制转化得到两路2比特输入,然后分别经过4PAM后叠加所得输出即为16QAM调制结果。 具体程序稍后编写。 思路2:复合相移法——可以借助前面编写的QPSK,相当于两路幅度不同的QPSK的叠加,比如幅度分别取1和3 。 思路1正交调幅法的设计方案: 两正弦波相位差...

weixin_30725467的博客 2910

Valgrind简单用法

瑞士军刀──Valgrind 作者:王聪 2006年8月1号 Valgrind的主要作者Julian Seward刚获得了今年的Google-O'Reilly开源大奖之一──Best Tool Maker。让我们一起来看一下他的作品。Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具...

iteye_13558的博客 427

【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 ValgrindLinuxValgrind 工具的全面使用指南

Valgrind 是一个非常强大的工具,主要用于内存管理错误检测,以及 CPU 和内存分析。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3152

Valgrind-性能分析工具

Valgrind-内存性能分析工具

u012173846的博客 825

C++ 内存泄漏检测工具——ValgrindLinux系统)

前六种是比较常见的问题,内存泄漏主要是有(4)(5)引起的,由于程序中申请了空间,但是没有在程序结束或是在函数结束时正确的释放,导致这段空间被无法在后面的程序中继续使用。对于数据量较大的程序,这是很危险的,由于内存占用问题,尽管函数或程序可能执行完毕,但是未被释放,但是内存仍被占用,这些空间无法后续使用或被其他程序使用,可能会导致计算机运行变慢,也可能导致后续程序无法正常运行。–log-file=< file > 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID。

可爱满分的博客 2939

Linux平台内存泄漏检测工具介绍: ASan vs Valgrind

经过我们的实际测试发现,Valgrind 在检测内存泄漏时比较准确,通过了三个简单的测试用例;aSan则没有正确检测出第三个用例中的内存泄漏; 不过,aSan 的功能更加丰富,比如示例4中可以检查内存越界,但是Valgrind只能检查内存越界问题。

m0_熊猫馆主的博客 1542

Linux内存泄漏检测工具--Valgrind

在写大型C/C++工程时难免会发生内存泄漏现象,系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。 常见的内存问题一共七种:1. 动态内存泄露;2. 资源泄露,比如文件指针不关闭;3. 动态内存越界;4.数组内存越界;5.动态内存double free;6.使用野指针,即未初始化的指针;7.释放野指针,即未初始化的指针。 内存问题非常难定位,对于小工程来说,简单去检查代码中new和dele

weixin_44498318的博客 3804

Linux内存泄漏检测工具 Valgrind使用

最近

Sakuya__的博客 1261

Linux 内存泄漏检测工具 Valgrind

Valgrind 是一款 Linux下(支持 x86、x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和delete),找出内存泄漏问题。Valgrind 中包含的 Memcheck 工具可以检查以下的程序错误:使用未初始化的内存 (Use of uninitialised memory)使用...

201

Linux 内存泄漏检测工具 Valgrind 的使用

目录参考文章:一、Valgrind简介二、Valgrind工具详解三、valgrind库下载四、valgrind库交叉编译安装 参考文章: valgrind简介以及在ARM上交叉编译运行 Valgrind 一、Valgrind简介 Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,或测试等。Valgrind可以检测内存泄漏和内存越界,还可以分析ca

jin787730090的博客 1232

linux内存泄漏检测工具valgrind的使用

在ubuntu中的安装: sudo apt-get install valgrind 使用方法: 例如编译后的可执行文件为main。 valgrind --leak-check=full ./main 如下测试使用malloc申请1k的内存空间,并且释放。 #include <stdio.h> #include <stdlib.h> int main(in...

仗劍走天涯 667

优化指南:Linux 应用程序内存泄漏检测工具 Valgrind 与 AddressSanitizer 的对比使用

Valgrind 是一个开源工具套件,主要用于内存调试和分析。其核心组件 Memcheck 能检测内存泄漏、非法访问等错误。Valgrind 通过动态二进制插桩(DBI)技术运行程序,无需修改源代码。优点无需重新编译代码,直接应用于已编译程序。检测范围广:包括内存泄漏、未初始化变量、越界访问等。支持多种平台和语言(如 C/C++)。缺点运行时开销大:速度慢,可能使程序运行速度降低 $10$ 倍以上。内存占用高:增加额外内存消耗。不支持所有架构:如某些嵌入式系统。基本使用方式。

2501_93894221的博客 762

Valgrind linux程序内存泄漏检测工具

Valgrind已经在linux应用程序开发社区中被广泛用来调试应用程序。它尤其擅长发现内存管理的问题,可以用来检查应用程序运行时的内存泄漏问题。 官网:http://valgrind.org/ 使用方法: 从官网下载最新稳定版valgrind,解压之后, 编译源码: ./configure make 在项目根目录生成可执行程序,名为:vg-in-place 简单的使用方式

沉寂的孤城 1198

动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind

在《内存、性能问题分析的利器——valgraind》一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析。(转载请指明出于breaksoftware的csdn博客) 之前的《利器》系列中,我们介绍了两种静态分析函数调用关系的工具(《静态分析C语言生成函数调用关系的利器——calltree》和《静态分析C语...

方亮的专栏 4973

内存、性能问题分析的利器——valgrind

valgrind是一个知名的分析软件集。我们可以使用它进行内存、多线程及性能等各种问题的分析。它采用非侵入方式,所谓非侵入方式是指:我们不用在代码中插入分析工具的库。这对于开发者来说是友好的。因为如果要将工具编译到文件中,或者要调用其提供的一些API,才能进行问题分析,无疑增大了用户的学习和使用成本。(转载请指明出于breaksoftware的csdn博客) valgrind ...

方亮的专栏 3252

Valgrind——内存调试和性能分析工具

Valgrind是一套开放源代码(GPL V2)的仿真调试工具集合,由内核(core)以及基于内核的其他调试工具组成。内核类似于一个框架(framework),模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。Valgrind 是一个强大的内存调试和性能分析工具,广泛用于 Linux 系统上的程序开发和测试。它可以帮助开发者检测内存泄漏、数组越界、未初始化变量等问题,并提供详细的报告。

wei_Embedded_z的博客 6536

Valgrind 的使用

Valgrind 的安装与使用 1、安装 sudo apt install valgrind 参数信息 用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具 --tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。 -h --help 显示所有选项的帮助,包括内核和选定的工具两者。 --version 显示valgrind内核的版本,每

ws_ear的博客 848

linux程序开发和测试:内存调试和性能分析工具Valgrind详细介绍

Valgrind 是一个强大的内存调试和性能分析工具,广泛用于 Linux 系统上的程序开发和测试。帮助开发者检测内存泄漏、数组越界、未初始化变量等问题,提供报告。支持多种编程语言,尤其是 C 和 C++。可以帮助开发者检测和修复程序中的内存问题和性能瓶颈。使用各种工具和选项,可以显著提高程序的质量和性能。内存错误检测器,能够发现开发中绝大多数内存错误使用情况,比如使用未初始化的内存、使用已经释放了的内存、内存访问越界。分析程序的函数调用关系;分析程序的缓存使用情况和缓存命中率,线程错误检测器等。

weixin_70208651的博客 9710

OpenClaw 性能调优五步法

本文介绍了优化OpenClaw性能的五步方法,将响应时间从3秒降至300毫秒。首先建立性能基线,分析模型加载、上下文检索等主要瓶颈。五步优化包括:1)启用模型缓存减少60%延迟;2)优化记忆检索策略降低25%延迟;3)并行化工具调用节省40%时间;4)智能选择轻量级模型减少50%推理时间;5)启用流式输出改善70%感知延迟。最终整体性能提升10倍,并建议建立持续监控机制。这些优化方法经过实战验证,适用于不同规模的OpenClaw部署场景。

刘一说的IT专栏 1353

黄河流域.rar shp文件

黄河流域.rar shp文件

上一篇: setsockopt函数解释
下一篇: web服务器负载均衡实现
McRae
博客等级 码龄10年 13粉丝 65原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值