valgrind的使用、原理

valgrind支持的工具:memcheck  addrcheck cachegrind Massid helgrind  Callgrind

运行时必须指明想用的工具,如果省略工具名,默认运行memcheck

1,memcheck

1),使用未初始化的内存

2),读/写已经被释放的内存

3),读/写内存越界

4),读/写不恰当的内存栈空间

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

6),使用malloc/new/new[]和free/delete/delete[]不匹配

7),memcpy()相关函数中的src和dst的内存重叠

常用选项:--leak-check=<no|summary|yes|full> [default:summary]

2,cachegrind

cache剖析器,模拟执行CPU中的L1,D1和L2 cache,可以很精准的支出戴拿中的cache未命中。可以打印cache未命中的次数、内存引用和发生cache未命中的每一行代码,每一个函数,每一个模块。可以打印每一行机器码的未命中次数。

3,helgrind

查找多线程中的竞争数据

寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。

4,Callgrind

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

一般用法:

valgrind --tool=callgrind ./test   会在当前目录下生成callgrind.out.[pid]

killall callgrind   结束程序

callgrind_annotate --auto=yes callgrind.out.[pid] > log

vi  log

5,Massif

堆栈分析器,能测量程序在堆栈中使用了多少内存

6,lackey

lackey是一个实例程序,以其为模板可以创建你自己的工具,在程序结束后,它打印一些基本的关于程序执行统计数据

Valgrind的参数(所有工具都适应)

--tool=<name>

-h --help

--version

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

--verbose     更详细的信息

--trace-children=<yes|no> 跟踪子进程,默认no

--trace-fds=<yes|no>    跟踪打开的文件描述符,默认no

--time-stamp=<yes|no>    增加时间戳到LOG信息,默认no

--log-fd=<number>     输出log信息到文件描述符

--log-file-exactly=<file>   输出log信息到file

--xml=yes         将信息以xml格式输出,只有memcheck可用

--num-callers=<number>

--error-exitcode=<number>  如果发现错误则返回错误码

--db-attach=<yes|no>    当出现错误,valgrind会自动启动调试器,默认no

--db-command=<command>   启动调试器的命令行选项

valgrind(memcheck)包含7类错误

1,illegal read/illegal write errors

提示信息:[invalid read of size 4]

2,use of uninitialised values

提示信息:[Conditional
jump or move depends on uninitialised value]

3,use of uninitialised or unaddressable values in system calls

提示信息:[syscall
param write(buf) points to uninitilaised bytes]

4,illegal frees

提示信息:[invalid
free()]

5,when a heap block is freed with an inappropriate deallocation function

提示信息:[Mismatched
free()/delete/delete[]]

6,overlapping source and destination blocks

提示信息:[source
and destination overlap in memcpy(,)]

7,memory leak detection

1),still reachable

内存指针还在还有机会使用或释放,指针指向的动态内存还没有被释放就退出了

2),definitely lost

确定的内存泄露,已经不能访问这块内存

3),indirectly lost

指向该内存的指针都位于内存泄露处

4),possibly lost

可能的内存泄露,仍然存在某个指针能够快速访问某块内存,但该指针指向的已经不是内存首位置

Invalid write of size 1 : 堆内存越界访问

Source and destination overlap in memcpy : 内存重叠

Invalid free() / delete / delete[]  : 重复释放

Use of uninitialised value of size 4 : 非法指针

HEAP SUMMARY:堆内存使用摘要

LEAK SUMMARY : 泄露摘要

ERROR SUMMARY: 错误总数

--trace-fds=yes

FILE DESCRIPTORS:3 OPEN AT EXIT :文件描述符

内存检查原理

检测原理:

1,当要读写内存中的某个字节时,首先检查这个字节对应的A bit。如果该A bit显示该位置是无效位置,memcheck则会报告读写错误

2,内核(core)类似于一个虚拟的CPU环境,这样当内存中的某个字节被加载到真实的CPU时,该字节对应的V bit也会被加载到虚拟的CPU环境中。一旦寄存器中的值,被用来产生内存地址,或者该值能够影响程序输出,则memcheck会检查对应的V bits,如果该值尚未初始化,则会报告使用未初始化内存错误。

时间: 2024-10-10 17:57:52

valgrind的使用、原理的相关文章

Unix下C程序内存泄露检测工具:valgrind的安装使用

Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖. Valgrind遵守GNU通用公共许可证条款,是一款自由软件. Valgrind的安装和使用 去官网www.valgrind.org下载最新版本的valgrind,我这里下载的是valgrind 3.11.0.tar.bz2. #tar xvf valgrind

c++中的vector原理

vectorvector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放.如果新值>当前大小时才会再分配内存. 它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝.这些都大大影响了vector的效率.对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存

应用 Valgrind 发现 Linux 程序的内存问题

如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题. 5 评论: 杨 经 ([email protected]), 软件工程师, IBM 2008 年 11 月 27 日 内容 应用 Valgrind 发现 Linux 程序的内存问题 回页首 Valgrind 概述 体系结构 Va

valgrind 工具介绍和简单的使用

最近老是遇上各种奇奇怪怪的core dump,不太会分析的情况下看到了这款工具.在这记录分享下. Valgrind 是个开源的工具,功能很多.例如检查内存泄漏工具---memcheck. Valgrind 安装: 去官网下载: http://valgrind.org/downloads/current.html#current 安装过程:(可以直接查看README文档来确认安装过程) tools/valgrind-3.12.0> pwd    /proj/MPS_DEV_REPO/xchonxu

【转】valgrind 的使用简介

转自http://blog.csdn.net/sduliulun/article/details/7732906 参考文档:http://bbs.ednchina.com/BLOG_ARTICLE_1772918.HTM 一  valgrind是什么? Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工

[转载]应用 Valgrind 发现 Linux 程序的内存问题

应用 Valgrind 发现 Linux 程序的内存问题 如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgrind 的使用以及工作原理,能够有效地定位进而避免应用开发中的内存问题. 应用 Valgrind 发现 Linux 程序的内存问题 回页首 Valgrind 概述 体系结构 Valgrind 是一套Linux下,开放源代码(GPL V2)的仿真

valgrind 介绍

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务. Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初

应用 Valgrind 发现 Linux 程序的内存问题及交叉编译for arm

Valgrind 概述 体系结构 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.Valgrind的体系结构如下图所示: 图 1 Valgrind 体系结构 Valgrind包括如下一些工具: Memcheck.这是va

c++Valgrind内存检测工具---19

原创博文,转载请标明出处--周学伟  http://www.cnblogs.com/zxouxuewei/ 一.Valgrind 概述 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具:而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务.Valgrind的体系结构如下图所示