内存检测工具Valgrind你还没用过吗?

这篇文章可能会有一些晦涩,前面是用于介绍理论上的使用方法,但是后面会用一个完整的例子和流程来解释Valgrind的用法,希望这篇文章能够对您有所帮助,谢谢😀

内存检测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 目标可执行文件

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

结果分析

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

具体例子

demo.c

#include<stdio.h>
#include<stdlib.h>
void f(void)
{
  int*x=malloc(10*sizeof(int));
  x[10]=0;  //问题1:越界访问
}  //问题2:malloc完内存没有释放

int main()
{
  f();
  return 0;
}

1.编译链接产生可执行文件demo在这里插入图片描述2.利用valgrind工具产生log.txt在这里插入图片描述
3.查看log.txt分析问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值