Linux下利用Valgrind工具进行内存泄露检测和性能分析

合集下载

内存调试工具 valgrind

内存调试工具 valgrind

内存调试工具valgrind来源::linux下面用c++写代码,在所难免会遇到segmentation fault(段错误)。

个人在编写ns扩展模块时候,遇到过很多段错误,虽然运行时刻经常由程序抛出段错误,但是段错误的发生的程序级别的原因多种多样,不过归结到系统级别上,段错误都是由于内存原因引起的(个人总结)。

会造成内存错误的程序级别的原因,也就是我们程序员所经常犯的错误大致可以分为以下几个方面:1,使用未初始化的指针-这是必然的,指针指空的东西,必然出错。

2,重复删除一个指针-必然,再次删除就会删除一个已经分配给别的程序的数据或者其他。

3,内存冲突-由于程序声明的两块数据区域重叠,造成混乱。

4,混杂的指针错误-只能具体问题具体分析,情况比较复杂。

对于一位刚开始用c++在linux编程的人来说,最常遇到的应该的就是1与2了。

当工程规模比较大,程序由小组完成而后整合等的情况下,很容易出现2,3,4的情况。

这时候的调试比较麻烦,也需要很多耐心。

我在做的wimax mesh的项目就是这样。

对于一个timer的使用,没有初始化,造成的段错误,一目了然。

工程进展非常顺利。

当工程做到50%时候(11.08号),遇到了一个段错误,结果调试到12.02号才调出来!我就来说一下我的调试历程吧!真是一波三折阿!开始的时候以为是1或者2的情况,反复检查,不是这样。

然后怀疑3或者4,结果由于没有使用任何工具,只是在代码中加打印信息,这时候只能把错误定位到transmit(p)这个函数上。

但是这个函数我只写了一行,就是transmit(p){downtarget_-recv(p,(Handle*)NULL);}程序在这个地方出错实在让人摸不到头绪,因为再往下执行就不是我代码的问题了,而是下层已有代码甚至是系统代码的问题阿!非常困扰!然后开始用gdb调试,gdb是一个很好的很强大的调试工具,我用的命令行的,所能完成的功能和vc下的调试工具差不多,只是需要看什么变量就是要用print×来看罢了,不过功能决不比它差。

Linux 内存调试工具- Valgrind 使用初探

Linux 内存调试工具- Valgrind 使用初探

Linux 内存调试工具- Valgrind 使用初探Valgrind 是在linux系统下开发应用程序时用于调试内存问题的工具。

它尤其擅长发现内存管理的问题,它可以检查程序运行时的内存泄漏问题。

它的官方网址是/ 下载最新版本的Valgrind,目前是3.2.0。

wget/downloads/valValgrind 是在linux系统下开发应用程序时用于调试内存问题的工具。

它尤其擅长发现内存管理的问题,它可以检查程序运行时的内存泄漏问题。

它的官方网址是/下载最新版本的Valgrind,目前是3.2.0。

wget/downloads/valkyrie-1.2.0.tar.bz2执行常规的安装步骤:./confgure && make && make install。

注意:系统必须安装QT的开发包。

即便这样在make 时还是出现qplatformdefs.h这个文件找不到的情况,导致make失败。

查找系统中的qplatformdefs.h 之后,发现没有存在于qt的标准头文件目录/usr/lib/qt-3.3/include。

如是将/usr/lib/qt-3.3/mkspecs /linux-g++/ 目录下该头文件复制标准头文件目录,重新make ,后面一切OK。

初次使用编译如下代码: gcc -Wall example.c -g -o example#include <stdlib.h>void f(void){int* x = malloc(10 * sizeof(int));x[10] = 0; // problem 1: heap block overrun} // problem 2: memory leak -- x not freedint main(void){f();return 0;}注意:gcc 的-g 选项让Valgrind调试输出时指出相应信息的代码所在的行号。

valgrind内存查看工具介绍

valgrind内存查看工具介绍

Valgrind内存工具学习目录一. VALGRIND工具简介 (1)1.1V ALGRIND体系结构概述 (1)1.2L INUX内存空间布局 (2)二. VALGRIND的安装 (4)2.1在L INUX系统下的安装 (4)2.2在设备中的安装 (4)三. MEMCHECK模块使用 (4)3.1使用未初始化的内存 (5)3.2内存读写越界 (6)3.3内存覆盖 (7)3.4动态内存管理错误 (8)3.5内存泄露 (9)3.6内存管理规则 (12)四. MASSIF模块的使用 (13)4.1问题引出 (13)4.2运行MASSIF模块 (14)4.3运行MS_PRINT (14)4.4.OUT文件声明 (14)4.5内存分配趋势图说明 (15)4.6内存分配详细说明 (16)4.6.1 内存分配快照表 (16)4.6.2 分配函数内存详细 (17)4.7参数说明 (17)五. CACHEGRIND使用 (18)5.1使用命令: (18)5.2结果分析 (18)六. HELGRIND模块使用 (20)七. 附录 (20)一. Valgrind工具简介用于定位应用程序开发中的内存问题。

Valgrind是linux下开源的内存问题检测工具。

1.1 Valgrind体系结构概述Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。

Valgrind由内核(core)以及基于内核的其他调试工具组成。

内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具;而其他工具则类似于插件(plug-in),利用内核提供的服务完成各种特定的内存调试任务。

Valgrind的体系结构如下图所示:图 1.1 Valgrind 体系结构Valgrind包括如下一些工具:Memcheck。

这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。

Linux下Valgrind的使用方法

Linux下Valgrind的使用方法

Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。

Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀。

一、Valgrind的主要功能Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind,Callgrind,Massif。

下面分别介绍个工具的作用:Memcheck 工具主要检查下面的程序错误:1.使用未初始化的内存(Use of uninitialised memory)2.使用已经释放了的内存(Reading/writingmemory after it has been free’d)3.使用超过malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)4.对堆栈的非法访问(Reading/writinginappropriate areas on the stack)5.申请的空间是否有释放(Memory leaks –where pointers to malloc’d blocks are lost forever)6.malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])7.src和dst的重叠(Overlapping src and dst pointers in memcpy() and related functions) CallgrindCallgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache模拟。

valgrind 原理

valgrind 原理

valgrind 原理
Valgrind是一个用于内存调试、内存泄漏检测和性能分析的开源工具。

其原理是基于动态二进制代码分析技朮。

Valgrind通过创建一个虚拟处理器环境来执行被分析的程序,然后在这个虚拟环境中对程序的指令进行解释执行,同时收集程序执行时的各种信息。

Valgrind的核心组件是Memcheck,它是用于检测内存错误的工具。

Memcheck通过在虚拟环境中跟踪每个分配的内存块,并记录其状态(已分配、已释放等),来检测内存泄漏、越界访问、未初始化内存访问等问题。

另外,Memcheck还能够检测并纠正一些常见的内存错误,比如使用未初始化的变量或释放已经释放的内存。

除了Memcheck之外,Valgrind还包括其他工具,如Cachegrind用于缓存分析、Callgrind用于程序性能分析、Helgrind用于多线程程序的并发错误检测等。

这些工具都利用Valgrind的动态二进制代码分析技朮,在虚拟环境中对程序进行执行和分析,从而实现各种不同类型的调试和性能分析功能。

总的来说,Valgrind的原理是通过创建虚拟环境,对程序进行动态二进制代码分析,从而实现对内存错误、性能问题等的检测和
分析。

它的独特之处在于能够在不修改程序源代码的情况下进行全面的调试和性能分析,极大地方便了开发人员进行程序调试和优化工作。

介绍一种常用的内存泄漏检测工具

介绍一种常用的内存泄漏检测工具

介绍一种常用的内存泄漏检测工具内存泄漏是软件开发中常见的问题之一,会导致程序运行变慢、崩溃或不可预料的行为。

为了及时发现和解决内存泄漏问题,开发人员通常会使用各种内存泄漏检测工具。

本文将介绍一种常用的内存泄漏检测工具——Valgrind。

Valgrind是一款强大的内存调试和性能分析工具,适用于Linux和其他类UNIX系统。

它支持多种编程语言,例如C、C++、Java等,而且提供了丰富的功能来帮助开发人员检测和调试内存泄漏问题。

Valgrind提供了Memcheck工具,是它最重要的组成部分之一。

Memcheck可以检测程序中的内存错误,包括内存泄漏、访问已释放内存、使用未初始化的内存等。

它通过在程序的每一个内存分配和释放操作上插入代码来监控内存的使用情况,并在发现错误时提供详细的报告。

这使得开发人员能够快速定位和修复内存泄漏问题。

Valgrind还提供了Cachegrind工具,可用于程序性能分析。

Cachegrind通过模拟CPU高速缓存的访问,帮助开发人员发现程序中的缓存未命中情况,以及其他与缓存相关的性能问题。

它可以提供关于指令执行次数、缓存命中率等统计信息,帮助开发人员进行性能的优化和调整。

除了Memcheck和Cachegrind,Valgrind还提供了其他一些有用的工具,例如Helgrind和DRD。

Helgrind主要用于检测并发程序中的竞争条件和死锁,能够在程序执行过程中动态地检测并发访问共享资源的错误。

DRD是一种用于检测C/C++多线程程序中的竞争条件的工具,可以帮助开发人员发现潜在的并发错误。

Valgrind还支持插件的扩展机制,允许开发人员创建自定义的工具。

这为开发人员提供了最大的灵活性,可以根据自己的需求设计和实现特定的内存检测工具。

使用Valgrind的步骤相对简单。

安装Valgrind并确保系统满足运行要求。

接下来,编译需要检测的程序,并使用Valgrind运行它。

valgrind memcheck用法

valgrind memcheck用法

valgrind memcheck用法Valgrind是一个开源的内存调试工具,可以帮助你检测程序中的内存错误。

Memcheck是Valgrind的一个重要组件,专门用于检测程序中的内存错误,包括使用未初始化的内存、使用已经释放的内存、越过内存边界等。

以下是使用Valgrind Memcheck的一般步骤:1.安装Valgrind:首先,你需要在你的系统上安装Valgrind。

对于大多数Linux发行版,你可以通过包管理器来安装。

例如,在Ubuntu上,你可以使用以下命令来安装Valgrind:arduinosudo apt-get install valgrind2.编译程序:在使用Valgrind运行程序之前,你需要先编译程序,以便生成可执行文件。

确保在编译时开启调试信息,以便Valgrind能够获取更多的信息。

例如,使用gcc编译器时,你可以使用以下命令编译程序:gcc -g -o myprogram myprogram.c3.使用Valgrind运行程序:一旦你有了可执行文件,就可以使用Valgrind来运行程序了。

使用以下命令来运行程序:bashvalgrind --tool=memcheck myprogram这将启动Memcheck工具来检测程序中的内存错误。

如果你的程序需要接受命令行参数,你可以将它们作为Valgrind命令的参数,例如:bashvalgrind --tool=memcheck myprogram arg1 arg2 ...4.查看结果:Valgrind会输出一个详细的报告,显示程序中潜在的内存错误。

报告将列出各种类型的错误,包括使用未初始化的内存、使用已经释放的内存、越过内存边界等。

你可以根据报告中的信息来修复程序中的错误。

以上就是使用Valgrind Memcheck的一般步骤。

请注意,Memcheck可能会使程序的运行速度变慢,因此在进行性能敏感的程序时需要谨慎使用。

valgrind内存泄漏分析

valgrind内存泄漏分析

valgrind内存泄漏分析概述valgrind 是 Linux 业界主流且⾮常强⼤的内存泄漏检查⼯具。

在其官⽹介绍中,内存检查(memcheck)只是其其中⼀个功能。

由于只⽤过其内存泄漏的检查,就不拓展分享 valgrind 其他功能了。

valgrind 这个⼯具不能⽤于调试正在运⾏的程序,因为待分析的程序必须在它特定的环境中运⾏,它才能分析内存。

内存泄漏分类valgrind 将内存泄漏分为 4 类。

明确泄漏(definitely lost):内存还没释放,但已经没有指针指向内存,内存已经不可访问间接泄漏(indirectly lost):泄漏的内存指针保存在明确泄漏的内存中,随着明确泄漏的内存不可访问,导致间接泄漏的内存也不可访问可能泄漏(possibly lost):指针并不指向内存头地址,⽽是指向内存内部的位置仍可访达(still reachable):指针⼀直存在且指向内存头部,直⾄程序退出时内存还没释放。

明确泄漏官⽅⽤户⼿册描述如下:This means that no pointer to the block can be found. The block is classified as "lost",because the programmer could not possibly have freed it at program exit, since no pointer to it exists.This is likely a symptom of having lost the pointer at some earlier point in theprogram. Such cases should be fixed by the programmer.其实简单来说,就是内存没释放,但已经没有任何指针指向这⽚内存,内存地址已经丢失。

定义⽐较好理解,就不举例了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux下利用Valgrind工具进行内存泄露检测和性能分析[日期:2012-06-25] 来源:Linux社区作者:yanghao23Valgrind通常用来成分析程序性能及程序中的内存泄露错误一 Valgrind工具集简绍Valgrind包含下列工具:1、memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。

2、callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。

3、cachegrind:分析CPU的cache命中率、丢失率,用于进行代码优化。

4、helgrind:用于检查多线程程序的竞态条件。

5、massif:堆栈分析器,指示程序中使用了多少堆内存等信息。

6、lackey:7、nulgrind:这几个工具的使用是通过命令:valgrand --tool=name 程序名来分别调用的,当不指定tool 参数时默认是 --tool=memcheck二 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能在这里帮上大忙。

例如:#include <stdlib.h>#include <malloc.h>#include <string.h>void test(){int *ptr = malloc(sizeof(int)*10);ptr[10] = 7; // 内存越界memcpy(ptr +1, ptr, 5); // 踩内存free(ptr);free(ptr);// 重复释放int *p1;*p1 = 1; // 非法指针}int main(void){test();return 0;}将程序编译生成可执行文件后执行:valgrind --leak-check=full ./程序名输出结果如下:==4832== Memcheck, a memory error detector==4832== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.==4832== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info ==4832== Command: ./tmp==4832====4832== Invalid write of size 4 // 内存越界==4832== at 0x804843F: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== Address 0x41a6050 is 0 bytes after a block of size 40 alloc'd==4832== at 0x4026864: malloc (vg_replace_malloc.c:236)==4832== by 0x8048435: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832====4832== Source and destination overlap in memcpy(0x41a602c, 0x41a6028, 5) // 踩内存==4832== at 0x4027BD6: memcpy (mc_replace_strmem.c:635)==4832== by 0x8048461: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832====4832== Invalid free() / delete / delete[] // 重复释放==4832== at 0x4025BF0: free (vg_replace_malloc.c:366)==4832== by 0x8048477: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== Address 0x41a6028 is 0 bytes inside a block of size 40 free'd==4832== at 0x4025BF0: free (vg_replace_malloc.c:366)==4832== by 0x804846C: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832====4832== Use of uninitialised value of size 4 // 非法指针==4832== at 0x804847B: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832====4832====4832== Process terminating with default action of signal 11 (SIGSEGV) //由于非法指针赋值导致的程序崩溃==4832== Bad permissions for mapped region at address 0x419FFF4==4832== at 0x804847B: test (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832== by 0x804848D: main (in /home/yanghao/Desktop/testC/testmem/tmp) ==4832====4832== HEAP SUMMARY:==4832== in use at exit: 0 bytes in 0 blocks==4832== total heap usage: 1 allocs, 2 frees, 40 bytes allocated==4832====4832== All heap blocks were freed -- no leaks are possible==4832====4832== For counts of detected and suppressed errors, rerun with: -v==4832== Use --track-origins=yes to see where uninitialised values come from ==4832== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 11 from 6) Segmentation fault从valgrind的检测输出结果看,这几个错误都找了出来。

2.Callgrind和gprof类似的分析工具,但它对程序的运行观察更是入微,能给我们提供更多的信息。

和gprof不同,它不需要在编译源代码时附加特殊选项,但加上调试选项是推荐的。

Callgrind 收集程序运行时的一些数据,建立函数调用关系图,还可以有选择地进行cache模拟。

在运行结束时,它会把分析数据写入一个文件。

callgrind_annotate可以把这个文件的内容转化成可读的形式。

生成可视化的图形需要下载gprof2dot:/svn/trunk/gprof2dot/gprof2dot.py这是个python脚本,把它下载之后修改其权限chmod +7 gprof2dot.py ,并把这个脚本添加到$PATH路径中的任一文件夹下,我是将它放到了/usr/bin目录下,这样就可以直接在终端下执行gprof2dot.py了。

Callgrind可以生成程序性能分析的图形,首先来说说程序性能分析的工具吧,通常可以使用gnu自带的gprof,它的使用方法是:在编译程序时添加-pg参数,例如:#include <stdio.h>#include <malloc.h>void test(){sleep(1);}void f(){int i;for( i = 0; i < 5; i ++)test();}int main(){f();printf("process is over!\n");return 0;}首先执行 gcc -pg -o tmp tmp.c,然后运行该程序./tmp,程序运行完成后会在当前目录下生成gmon.out文件(这个文件gprof在分析程序时需要),再执行gprof ./tmp | gprof2dot.py |dot -Tpng -o report.png,打开report.png结果:显示test被调用了5次,程序中耗时所占百分比最多的是test函数。

再来看 Callgrind的生成调用图过程吧,执行:valgrind --tool=callgrind ./tmp,执行完成后在目录下生成"callgrind.out.XXX"的文件这是分析文件,可以直接利用:callgrind_annotate callgrind.out.XXX 打印结果,也可以使用:gprof2dot.py -f callgrind callgrind.out.XXX |dot -Tpng -o report.png 来生成图形化结果:它生成的结果非常详细,甚至连函数入口,及库函数调用都标识出来了。

相关文档
最新文档