数科院博客园 - 内存检测
type: channel
link: https://blog.icsc.vip/index.php/tag/内存检测/
items: 浅析Linux下的Valgrind内存检测工具

浅析Linux下的Valgrind内存检测工具
type: item
date: 2019-10-21T00:58:00+00:00
description: 1.Valgrind介绍Valgrind是一套Linux下，开放源代码的仿真调试工具的集合。Valgrind由内核以及基于内核的其他调试工具组成。内核类似于一个框架，它模拟了一个CPU环境，并提供服务给其他工具；而其他工具则类似于插件，利用内核提供的服务完成各种特定的内存调试任务。2.Valgrind包括如下一些工具：Memcheck。这是valgrind应用最广泛的工具，一个重量级的内存检查器，能够发现开发中绝大多数内存错误使用情况，比如：使用未初始化的内存，使用已经释放了的内存，内存访问越界等。Callgrind。它主要用来检查程序中函数调用过程中出现的问题。Cachegrind。它主要用来检查程序中缓存使用出现的问题。Helgrind。它主要用来检查多线程程序中出现的竞争问题。Massif。它主要用来检查程序中堆栈使用中出现的问题。Extension。可以利用core提供的功能，自己编写特定的内存调试工具。3.Memcheck 能够检测出内存问题，关键在于其建立了两个全局表。Valid-Value 表：对于进程的整个地址空间中的每一个字节，都有与之对应的 8 个 bits；对于 CPU 的每个寄存器，也有一个与之对应的 bit 向量。这些 bits 负责记录该字节或者寄存器值是否具有有效的、已初始化的值。Valid-Address 表：对于进程整个地址空间中的每一个字节，还有与之对应的 1 个 bit，负责记录该地址是否能够被读写。当要读写内存中某个字节时，首先检查这个字节对应的 A bit。如果该A bit显示该位置是无效位置，memcheck 则报告读写错误。内核类似于一个虚拟的 CPU 环境，这样当内存中的某个字节被加载到真实的 CPU 中时，该字节对应的 V bit 也被加载到虚拟的 CPU 环境中。一旦寄存器中的值，被用来产生内存地址，或者该值能够影响程序输出，则 memcheck 会检查对应的V bits，如果该值尚未初始化，则会报告使用未初始化内存错误