valgrind使用笔记

1、概述:

              valgrind是由内核以及其他调试工具构成;内核模拟一个CPU环境,并未其他工具提供服务,其他工具类似插件,利用内核完成各种调试任务:


此图转自http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html#4.利用Memcheck发现常见的内存问题|outline


valgrind包含的工具:

1、Memcheck:内存检查器,能够发现绝大多数内存错误使用情况:比如未初始化的内存、使用已经释放的内存、内存越界访问等

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

3、Cachegrind:用来检查程序中缓存使用出现的问题。

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

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

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


2、Linux程序内存空间布局

典型的内存空间布局:

高地址

命令行参数和环境变量
栈(stack)


堆(heap)
未初始化的数据段(.bss段)
初始化的数据段(.data段)
代码段(.text段)

低地址


代码段:存放具体要执行的指令,代码段是共享的,相同的代码在内存中只会有一份拷贝,同时代码段是只读的,防止程序由于错误修改自身的指令

初始化的数据段:存放需要明确赋初始值的变量:例如经过初始化的全局变量;这两段位于可执行文件中,内核在调用exec函数时启动该程序时从源程序文件中读入。

未初始化数据段:内核在执行该程序前,将其初始化为0或者NULL

堆:heap:用于动态内存申请,malloc和new

栈:stack:函数中局部变量以及在函数调用过程中的临时变量。


3、内存检查原理

Memcheck检测内存问题的原理:

valgrind使用笔记_第1张图片

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

(1)Valid-Value表:

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

(2)Valid-Address表:

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


检测原理:

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

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


4、命令行:

valgrind   [valgrind 的参数]  可执行文件  [可执行文件参数]

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes  可执行文件名    参数



5、输出解析:




6、其他

Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是内存泄露(Definitely lost)

Possibly lost是指仍然存在某个指针能够访问某块内存,但是该指针指向的已经不是该内存首地址;

Definitely lost是指已经不能够访问这块内存;                                                          

                                 Definitly lost又分为两种:直接的Directly和间接的indirectly

                                                          直接与间接的区别就是:直接没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处;


still  reacheable:是指仍有指针引用该内存块,只是没有释放而已;


其中still reacheable类型的内存可以有kernel在退出程序时回收,或者是在程序运行中这块内存一直占用,直到程序结束才会释放,这样也会被认为still reacheable;

而Definitely lost却无法回收,所以后者危害比较大。
















你可能感兴趣的:(linux)