C/C++内存检测工具Valgrind

Posted wangkeqin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++内存检测工具Valgrind相关的知识,希望对你有一定的参考价值。

内存检测Valgrind简介

Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O‘Reilly开源大奖的Julian Seward,

包含一个内核──一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测,

我们可以使用它的工具:Memcheck。

 

Valgrind 安装

方法 1.  valgrind官网:http://valgrind.org下载

方法 2.  Ubuntu  sudo apt-get install valgrind

 

Memcheck检测范围:

用来检测c/c++程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。

所以,它能检测以下问题: 


1) 对未初始化内存的使用; 


2) 读/写释放后的内存块;

 
3) 读/写超出malloc等分配的动态内存范围; 


4)读/写不适当的栈中内存块; 


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


6)不正确的malloc/free或new/delete匹配; 


7)memcpy()相关函数中的dst和src指针重叠问题。 

 

Memcheck 检查步骤及注意事项

1)在编译程序的时候打开调试模式(gcc编译器的-g选项),以便显示行号,编译时去掉-O1 -O2等优化选项;检查的C++程序的时候,考虑加上选项: -fno-inline ,这样它函数调用链会很清晰

2)执行:valgrind --tool=memcheck --leak-check=full --log-file=./log.txt  ./YourProgram

3)程序运行结束,查看 log.txt 中的结果。

 

 

结果分析

Valgrind(memcheck)包含这7类错误,黑体为一般的错误提示:


1)illegal read/illegal write errors    非法读取/非法写入错误

2)use of uninitialised values        使用未初始化的区域

3)use of uninitialised or unaddressable values in system calls 系统调用时使用了未初始化或不可寻址的地址

4)illegal frees   非法的释放

5)when a heap block is freed with an inappropriate deallocation function 分配和释放函数不匹配

6)overlapping source and destination blocks   源和目的内存块重叠

7)memory leak detection    内存泄漏检测

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


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


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


       7.4 Possibly lost
       可能的内存泄露,仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内

  存首位置
      7.5 Suppressed  某些库产生的错误不予以提示,这些错误会被统计到suppressed项目

 































以上是关于C/C++内存检测工具Valgrind的主要内容,如果未能解决你的问题,请参考以下文章

找不到 Valgrind 检测到的内存泄漏

调试Linux下超强内存检测工具Valgrind

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

内存检测工具Valgrind

Unix下C程序内存泄漏检测工具Valgrind安装与使用

开发工具Valgrind内存问题检测工具(valgrind)的使用