内存相关问题排查思路
- RTOS
- 2024-01-08
- 139热度
- 0评论
最近在项目上遇到一个棘手问题,有一块内存在运行过程中概率性的被异常修改,由于牵扯到多方的应用程序,受限于调试手段排查了不少时间,现简单总结下遇到此类问题的排查思路。
添加额外的magic
核心原理就是在malloc的时候,额外多申请一些内存,通常情况下是在头部和尾部多申请一块空间,填充固定的值如0x55,待调用free函数的时候就检测该头部和尾部的数据是否还是原来填充的值如0x55,如果不是那说明该内存已经被修改了,打印释放的backtrace,即可初步定为是那段内存被踩。
记录最近申请和释放的内存
核心原理使用一个大数组记录最近申请和释放的内存,在调用malloc和free的时候都可以backtrace谁调用的,当出现问题时将记录的数据dump出来,检查哪些内存申请了没有释放或者二次释放。
asan机制
每个字节的内存使用1个bit来进行权限管理,在申请内存时将bit设置为可读写,在释放内存时将对应的bit设置为不可读写。当在进行内存读写操作时检查权限,这种方法对应use after free有很好的效果,缺点就是需要工具链支持kernel-address编译参数,在读写内存时进行插桩代码检查权限,这样也损耗性能,同时需要额外分配1/8的内存资源来管理权限。