【Linux】内存检测工具Valgrind

简介: 【Linux】内存检测工具Valgrind

内存检测工具Valgrind

Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O'Reilly开源大奖的Julian Seward,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,测试等。

内存检测,使用它的Memcheck工具。


Valgrind安装

  • 官网
http://valgrind.org
  • ubuntu
sudo apt-get install valgrind

Memcheck检测范围

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

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

Memcheck检查步骤及注意事项

  1. 在编译程序的时候打开调试模式(gcc编译器的-g选项),以便显示行号,编译时去掉-O1 -O2等优化选项,检查的是C++程序的时候,考虑加上选项:-fno-inline,这样它的函数调用链接会很清晰。
  2. 执行:
valgrind --tool=memcheck --leak-check=full --log-file=./log.txt  ./YourProgram
  1. 程序运行结束,打开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 —— 内存泄漏检测

    1. Still reachable —— 内存指针还在,还有机会使用或者释放,指针指向的动态内存还没有被释放就退出了
    2. Definitely lost —— 确定的内存泄露,已经不能够访问这块内存
    3. Indirectly lost —— 指向该内存的指针位于内存泄露处
    4. Possibly lost —— 可能的内存泄露,仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首位置
    5. Suppressed —— 某些库产生的错误不予以提示,这些错误会被统计到suppressed项目

示例

产生错误的代码:

#include <stdlib.h>
void f(void){
        int *x = malloc(10*sizeof(int));
        x[10] = 0;//越界访问
        //内存没释放
}
int main(void){
        f();
        return 0;
}

编译:

gcc -g demo.c -o demo

检测:

valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./demo

查看错误:

image-20220716110219757

相关文章
|
25天前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
49 5
Linux系统之安装Ward服务器监控工具
|
27天前
|
JSON JavaScript Linux
Linux系统之安装cook菜谱工具
【10月更文挑战第15天】Linux系统之安装cook菜谱工具
34 2
Linux系统之安装cook菜谱工具
|
10天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
16天前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
57 1
|
16天前
|
缓存 监控 Linux
掌握Linux性能分析:深入探索perf工具
【10月更文挑战第26天】
22 1
|
16天前
|
存储 缓存 监控
|
1月前
|
存储 缓存 监控
Linux中内存和性能问题
【10月更文挑战第5天】
38 4
|
1月前
|
算法 Linux
Linux中内存问题
【10月更文挑战第6天】
41 2
|
13天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
22 0
|
1月前
|
存储 缓存 固态存储