Linux Valgrind-Memcheck内存检测工具

1 什么是Valgrind-Memcheck内存检测

Valgrind-Memcheck用来检测 c/c++程序中出现的内存问题,所有对内存的读写都会被检测到

对一切的malloc()/free()/new/delete 调用都会被捕获。

2 主要检测以下问题:

  1. 对未初始化内存的使用;
  2. 读/写释放后的内存块;
  3. 读/写超出 malloc 等分配的动态内存范围;
  4. 读/写不适当的栈中内存块;
  5. 内存泄漏,指向一块内存的指针永远丢失;
  6. 不正确的 malloc/free 或 new/delete 匹配;
  7. memcpy()相关函数中的 dst 和 src 指针重叠问题。

Memcheck 检查步骤及注意事项

  • 1 在编译程序的时候打开调试模式(gcc 编译器的-g 选项),以便显示行号
  • 2 编译时去掉-O1 -O2 等优化选项
  • 3 检查的是 C++程序的时候,考虑加上选项: -fno-inline ,这样它函数调用链会很清晰
  • 4 执行:valgrind --tool=memcheck --leak-check=full –log-file=[日志] [检测的程序]
  • 5.程序运行结束,查看日志中的结果信息

结果分析

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
	
	某些库产生的错误不予以提示,这些错误会被统计到 suppressed 项目
	7.5 Suppressed 

1 演示代码:

//demo.c
#include<stdlib.h>
void f(){
   
        int *x =malloc(10*sizeof(int));		//问题1:没有释放动态分配的资源
        x[10]=0;							//问题2:越界访问
}
int main(){
   

        f();
        return 0;
}

2 编译:

gcc ./demo.c -o -g demo.exe

在这里插入图片描述
3 使用memcheck内存检测工具生成日志文件:
在这里插入图片描述4 分析日志文件
在这里插入图片描述

相关推荐

  1. go语言内存泄漏检查工具

    2023-12-08 22:08:04       29 阅读
  2. C++ 内存泄漏检测工具——Valgrind(Linux系统)

    2023-12-08 22:08:04       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 22:08:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 22:08:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 22:08:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 22:08:04       20 阅读

热门阅读

  1. postgresql自带指令命令系列一

    2023-12-08 22:08:04       25 阅读
  2. 命令模式-C++实现

    2023-12-08 22:08:04       29 阅读
  3. 不同进程共享变量

    2023-12-08 22:08:04       38 阅读
  4. IntelliJ IDEA安装使用教程#intellij idea

    2023-12-08 22:08:04       45 阅读