Linux中使用Valgrind进行C/C++内存检测

Linux中的C/C++内存检测

1.使用Valgrind工具

Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合。它包含一个内核,也就是一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。C/C++内存检测,我们可以使用它的工具:Memcheck。

安装方法:
1)从官网http://valgrind.org下载最新版本(当前3.11)

tar xvf valgrind-3.11.1.tar.bz2
cd valgrind-3.11.1
./configure --prefix=/usr/local/valgrind--指定安装目录
make
make install

2)使用安装命令

sudo apt-get install valgrind

1.1Memcheck使用方法

执行:valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./YourProgram
这样就能把检测信息输出到log.txt中,后边会给出实例。
其他具体的使用方法可以参见https://valgrind.org/docs/manual/manual.html

2.Memcheck的检测范围以及结果分析。

2.1 检测范围

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

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

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

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

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

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

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

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

2.2 结果分析

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项目

3.具体的实例

3.1 使用malloc后没有free导致的内存泄漏

代码:
在这里插入图片描述
Memcheck结果:
在这里插入图片描述
这里可以看到有确定的40Byte的内存泄漏,1次内存分配,没有释放。还可以看到出错的位置和函数。

3.2越界访问

代码:
在这里插入图片描述
Memcheck结果:
在这里插入图片描述
可以看到 Invalid write of size 4,这里有四个字节的无效访问。

3.3 使用未初始化的内存

代码:
在这里插入图片描述
Memcheck结果:
在这里插入图片描述

可以看到这里Use of uninitialised value of size 4使用了未初始化的内存。
在这里插入图片描述还可以看到这里分配了两次,释放了一次,实际上是因为 C++ 在分配内存时,为了提高效率,使用了它自己的内存池。当程序终止时,内存池的内存才会被操作系统回收,所以 Valgrind 会将这部分内存报告为still reachable 的,需要注意,reachable 的内存不代表内存泄漏,例如,从上面的输出中可以看到,有 18944 个字节是 reachable 的,但没有报告内存泄漏。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值