valgrind内存查看工具介绍

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

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内存分配详细说明 (15)

4.6.1 内存分配快照表 (15)

4.6.2 分配函数内存详细 (16)

4.7参数说明 (17)

五. CACHEGRIND使用 (17)

5.1使用命令: (17)

5.2结果分析 (17)

六. HELGRIND模块使用 (19)

七. 附录 (20)

一. Valgrind工具简介

用于定位应用程序开发中的内存问题。Valgrind是linux下开源的内存问题检测工具。

1.1 Valgrind体系结构概述

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

图 1.1 Valgrind 体系结构

Valgrind包括如下一些工具:

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

Callgrind。它主要用来检查程序中函数调用过程中出现的问题。

Cachegrind。它主要用来检查程序中缓存使用出现的问题。

Helgrind。它主要用来检查多线程程序中出现的竞争问题。

Massif。它主要用来检查程序中堆栈使用中出现的问题。

Extension。可以利用core提供的功能,自己编写特定的内存调试工具。

1.2 Linux内存空间布局

Linux 程序内存空间布局

要发现Linux下的内存问题,首先一定要知道在Linux下,内存是如何被分配的?下图展示了一个典型的Linux C程序内存空间布局:

图 1.2 典型内存空间布局

一个典型的Linux C程序内存空间由如下几部分组成:

代码段(.text):这里存放的是CPU要执行的指令。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读的,防止程序由于错误而修改自身的指令。

初始化数据段(.data):这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=100。需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入。

未初始化数据段(.bss):位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null。例如出现在任何函数之外的全局变量:int sum;

堆(Heap):这个段用于在程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存。

栈(Stack): 函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。内存检查原理

Memcheck检测内存问题的原理如下图所示:

图 1.3 内存检查原理

Memcheck 能够检测出内存问题,关键在于其建立了两个全局表。

Valid-Value 表:

对于进程的整个地址空间中的每一个字节(byte),都有与之对应的8 个bits;对于CPU 的每个寄存器,也有一个与之对应的bit 向量。这些bits 负责记录该字节或者寄存器值是否具有有效的、已初始化的值。

Valid-Address 表

对于进程整个地址空间中的每一个字节(byte),还有与之对应的1 个bit,负责记录该地址是否能够被读写。

检测原理:

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

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

二. Valgrind的安装

2.1 在Linux系统下的安装

版本:valgrind-3.4.1.tar.bz2

下载地址:

安装方法:

1. bzip2 -d valgrind-3.4.1.tar.bz2 解压为tar文件

2. tar –xvf valgrind-

3.

4.1.tar

3. cd valgrind-3.

4.1

4. ./configure

5. Make install

6. Valgrind –help使用说明

7. 使用vi工具编写一个.c文件,例如:vi a.c

8. gcc -o badloop badloop.c 生成可执行文件

9. 再用valgrind 工具对可执行文件进行内存问题检测

10. 对于massif模块,valgrind执行完之后会生成类似massif.out.12464的文件

可以使用ms_print massif.out.12464 > massif.out.12464.log生成整理后的结果。注:目前已经在10.14.14.182这台linux服务器上安装了valgrind

2.2 在设备中的安装

1.将valgrind.tar包在/lib/下解压缩

2.将vlagrind程序放在/opt/nsfocus/bin/下即可

三. Memcheck模块使用

在设备里安装好valgrind后,如下述方法使用:

RANK=0 valgrind --tool=memcheck –leak-check=full ./class.85 1

相关文档
最新文档