Memcheck 能够检测出内存问题,关键在于其建立了 两个全局表
Valid-Value 表:
- 对于进程的 整个地址空间中的每一个字节 (byte),都有与之 对应的 8 个 bits
- 对于 CPU 的每个寄存器,也有 一个与之对应的 bit 向量
这些 bits 负责记录该字节或者寄存器值 是否具有 有效的、已初始化的值
Valid-Address 表
对于 进程整个地址空间中的每一个字节 (byte),还有与之对应的 1 个 bit,负责 记录该地址是否能够被读写
检测原理
当要 读写内存中某个字节时:
- 首先检查这个字节对应的 A bit
- 如果 该 A bit 显示该位置是无效位置,memcheck 则报告读写错误
- 内核(core)类似于一个虚拟的 CPU 环境,这样当内存中的某个字节被加载到真实的 CPU 中时,该字节对应的 V bit 也被加载到虚拟的 CPU 环境中。
- 一旦寄存器中的值被用来产生内存地址,或者该值能够影响程序输出,则 memcheck 会检查对应的 V bits,如果该值尚未初始化,则会报告使用未初始化内存错误。