valgrind包含重量级的内存检查器memcheck。用于检查C和C++代码。能够发现:使用未初始化的内存,内存访问越界,内存泄露,使用已经释放了的内存等。使用memcheck会导致10%到30%的性能损失。

Memcheck侦听(intercept)分配和释放内存的函数调用,从而感知程序的内存使用情况。分配内存的函数有malloc、calloc、realloc、valloc、memalign、new,释放内存的函数有free和delete。

虽然memcheck不能检测出所有的内存错误。比如栈上静态分配内存的数组,访问越界时检测不到。但是它可以发现很多会导致程序崩溃的错误,比如segmentation fault。

使用方法:

编译程序时建议使用-g选项,这样才可以在错误消息中可以看到代码行号。

Valgrind调用方法:

valgrind [valgrind-options] your-prog [your-prog-options]

valgrind --leak-check=full ./heap_overrun

选项--show-leak-kinds=<set> [default: definite,possible]:full leak search时指定显示哪些泄露的类型。例如:--show-leak-kinds=definite,则只显示definite。--show-leak-kinds=all,则显示所有类型。

Memcheck报错含义:

1、Illegal read / Illegal write errors:比如读写还没有分配的内存块、读写已经被free的内存块、内存访问越界(包括超出堆中内存块的范围、访问了栈中不能访问的区域)。使用选项--read-var-info,虽然Memcheck会运行的更慢,但是可以给出更详细的信息。

2、Use of uninitialised values:使用未初始化的值,也就是说值不确定。有两种未初始化的成因:函数中的局部变量没有被初始化;堆上的内存块,在使用之前没有被初始化。如果想知道成因,使用选项--track-origins=yes。这虽然导致memcheck速度更慢,但是可以让定位出根本原因变得容易。

3、Use of uninitialised or unaddressable values in system calls。系统调用中参数是否已经初始化;如果要读程序提供的buffer,会检查buffer是否addressable、并且初始化了的;如果要写程序提供的buffer,会检查buffer是否addressable。后两点简单来说就是检查程序提供的buffer是否可用。

4、Illegal frees:重复释放内存块,或者指针没有指向内存的起始位置。

5、When a heap block is freed with an inappropriate deallocation function:C++专用报错,释放内存的函数没有和分配内存的函数相对应。下面是C++的内存分配和释放函数的配对要求:

1.如果使用malloc、calloc、realloc、valloc或者memalign分配内存,则只能使用free来释放内存。

2.如果使用new来分配内存,则只能使用delete来释放内存。

3.如果使用new[]分配内存,则只能使用delete[]来释放内存。

6、Overlapping source and destination blocks:用于检查memcpy、strcpy、strncpy、strcat、strncat的源和目的内存块是否有重叠。如果这些函数的source block和destination block有重叠,结果可能不正确。

7、Fishy argument values:需要的内存大小是负数或者大的离谱的正数。

8、Memory leak detection内存泄露报错:

Definitely lost:确定的内存泄露,程序已经无法访问这块内存了。它只是指出哪里分配的内存没有被释放,但是这个内存需要在哪里释放,要理解了程序才能知道。一块内存可能在很多执行路径中被使用,代码中,释放的位置可能有多处,任何一处没有释放都会导致泄露。所以修复bug可能并不容易。

Possibly lost:可能的内存泄露,仍然存在某个指针能够访问这块内存,但该指针指向的已经不是该内存块的起始位置。如果程序还能够找到内存块的起始位置,比如记录了当前指针相对于起始位置的偏移量,那么内存就还可以被释放。但是程序是否能够找到内存的起始位置,valgrind感知不到,这需要理解了程序的逻辑才能清楚。

Indirectly lost: 指向该内存的指针都位于已经泄露的内存中。

Still reachable:内存仍然可达。但是到程序结束时仍然没有释放。如果程序继续运行,也有可能会释放。缺省不报告。除非--show-reachable=yes。

介绍algrind的安装与 使用 方法,通过对 内存 错误的各种出错信息的认识,帮助 使用 者正确 使用 valgrind 工具。是在ubuntu上编辑的,请在ubuntu上打开 参考:https://blog.csdn.net/u012662731/article/details/78652651 https://www.ibm.com/developerworks/cn/linux/l-cn- valgrind /
valgrind 支持的工具: mem check addr check cachegrind Massid helgrind  Callgrind 运行时必须指明想用的工具,如果省略工具名,默认运行 mem check 1, mem check 1), 使用 未初始化的 内存 2),读/写已经被释放的 内存 3),读/写 内存 越界 4),读/写不恰当的 内存 栈空间 5), 内存泄露 ,指向一块 内存 的指针永远
这些 bits 负责记录该字节或者寄存器值 是否具有 有效的、已初始化的值 Valid-Address 表 对于 进程整个地址空间中的每一个字节 (byte),还有与之对应的 1 个 bit,负责 记录该地址是否能够被读写 检测 原理 当要 读写 内存 中某个字
今天面试的时候问了一下怎么检查 内存泄露 ,然后我就有点懵,现在开发基本都用智能指针了,以前用的时候也很少碰见 内存泄露 的问题,基本都是瞎调试.只依稀记得有这么一个工具可以用来 检测 内存泄露 ,实际没用过,只好今天来学习一波. 首先你得安装,安装直接sudo apt get install就好了.转载:https://blog.csdn.net/destina/article/details/619844...
文章目录一、简介二、入门三、打印信息说明四、抑制错误五、命令行详解六、 使用 Valgrind gdbserver和GDB调试程序七、 Mem check 内存 错误 检测 器) 一、 Valgrind 概述 Valgrind 是用于构建动态分析工具的仪器框架。它附带了一组工具,每个工具都执行某种调试,分析或类似任务,可帮助您改进程序。 Valgrind 的架构采用模块化设计,因此可以轻松创建新工具,而不会干扰现有结构。 二、工具集列表 1、 Mem check 是一个 内存 错误 检测 器。它可以帮助您使程序,尤其是那些用C和C +
valgrind 研究记录 一. 介绍 可以用来做 内存 检测 工具、性能分析工具,基本 原理 是对目标二进制文件进行动态二进制翻译,翻译得到体系架构无关的中间表示(vex),然后在翻译得到的中间表示中插入自己的监控代码(instrument),最后再把修改过的vex编译成主机机器码执行,可以做到指令级别的监控,目标程序就相当于运行在一个虚拟的cpu上。 二. 整体架构 整个程序有个共用的入口,其它实现特定功能的模块都作为它的一个tool( mem check 、lackey),入口部分主要完成参数解析还有目标程序的加载,t
valgrind 是一个开源的工具,主要用于 检测 和调试C和C++程序。它包含了多个工具,其中最常用的是 内存 检查器 mem check mem check 通过在程序运行时模拟执行程序的每一条指令,来 检测 内存 错误。 具体来说, mem check 会跟踪程序中的每一个 内存 分配和释放操作,并记录下每个 内存 块的起始位置、大小和状态。当程序访问未初始化的 内存 越界 访问 内存 内存泄露 等问题时, mem check 会给出相应的警告信息。 在 检测 内存 错误时, mem check 会对程序进行动态二进制重写,将所有的 内存 访问操作都通过一个影子 内存 进行跟踪。这样可以在运行时捕获到所有的 内存 访问操作,并进行相应的检查和记录。 valgrind 原理 是通过在程序运行时对指令进行模拟和跟踪,来 检测 和定位 内存 错误。它的 内存 检查器 mem check 能够发现 使用 未初始化的 内存 内存 访问 越界 内存泄露 等问题。虽然 使用 valgrind 会导致一定的性能损失,但它是一个非常有用的工具,可以帮助开发人员找出和修复程序中的 内存 错误。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [ valgrind 内存 检测 原理 使用 报错 含义 ](https://blog.csdn.net/jxzdsw/article/details/125226935)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]