自己动手写一个野指针检查工具

只描述思路:

1、接管libc的malloc和free,并且分配内存的时候分配固定页大小(例如选512kb)的整数倍;

2、malloc把本次分配内存的最后一个512kb内存区域作为信息记录区域,可以写入一些信息来帮助分析野指针:

2.1、是否已经释放的标志,反正自己写几个字节的特殊字符了,例如dead

2.2、记录本次malloc的函数调用栈(关于如何获取调用栈以及如何符号化调用栈,可以使用libunwind库),为了识别一个调用栈的起始,可以自己写入标识符

3、free函数

3.1、修改已经释放的标志

3.2、记录本次释放对象的调用栈,是在malloc的512kb区域里面接着写,不要覆盖掉之前记录的堆栈

4、当崩溃发生时候,找到崩溃对应的内存区域,把最后512kb的数据保留下来,通过符号化之前记录的所有调用栈信息来帮助我们分析野指针对象时合适分配的、何时析构的;


涉及到的算法:只要是malloc的内存分配,划分为512的固定块以后,每次分配内存我们都需要找到一个固定的起始地址,使得其最后的512内存是属于信息记录区域。简单来说分配的时候要避免把有写了信息记录的内存作为对象的合理存储区域,否则记录的信息就会覆盖掉了。

由于这种记录信息区域必须保留的原因,一般来说512kb能够记录多少次malloc/free操作呢,假设平均的调用栈深度为20,则一次malloc/free占据80字节,512KB可以记录大约6553次malloc/free操作。随着记录信息区域越来越多,当无法满足malloc的分配要求的时候,要么选择清除掉某些信息记录区域,要么就让程序重新运行了。



上面的分析思路是主要用来帮助分析那些非稳定出现的野指针问题,若是稳定出现的问题就更好分析了,也许加点日志就搞定了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值