概述
基本概念
LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具。LMS能够实时检测缓冲区溢出(buffer overflow),释放后使用(use after free)和释放野指针(wild pointer),在异常发生的第一时间通知操作系统,结合操作系统Backtrace等定位手段,能准确定位到产生内存问题的代码行,大大提升内存问题定位效率。
运作机制
LMS使用影子内存映射标记系统内存的状态,一共可标记为四个状态:可读写,不可读写,部分可读写,已释放。影子内存存放在内存池的尾节点中。
- 编译程序时,会在数组和结构体等局部变量两侧插入红区,并将红区所映射的影子内存设置为“不可读写”。
- 内存在堆上被释放时,会将被释放内存的影子内存设置为“已释放”状态。
- 编译代码时,会在代码中的读写指令前插入检测函数,对地址的合法性进行检验。主要是检测访问内存的影子内存的状态值,若检测到影子内存为不可读写,则会报溢出错误;若检测到影子内存为已释放,则会报释放后使用(Use After Free)错误。