一种Windows下懒式探测野指针的方法
扫描二维码
随时随地手机看文章
一种Windows下探测野指针的方法
在一个大型项目中遇到了crt报告HEAP: Free Heap block XXXXXXXX modified at YYYYYYYY after it was freed。
原因很明确:野指针,但是因为项目里大量使用了智能指针,因此要定位问题就略头痛了。
最初是准备在程序运行时建立内存断点以监视所有对YYYYYYYY的写操作。但是刚开始运行的时候YYYYYYYY是不能访问的。
于是准备重载new 操作以在该内存块能访问的时候下断点,然而对于一个要反复分配内存的程序,手工监视某个页是否可以访问实在太麻烦了,根本没有可操作性。于是我在new里面加了如下代码:
{
static BOOL bMark=FALSE;
__try
{
if(!bMark)
{
int i=*((PUINT8)(/*出错地址*/);
_ASSERT(FALSE);
}
bMark=TRUE;
}
__except(1)
{
}
}
每次new操作之后都试图访问YYYYYYYY,如果不能访问,则进入异常处理部分直接忽略_ASSERT()及后面的代码,继续运行。如果可以访问,那么_ASSERT()会触发一个断点。此时可以手动在YYYYYYYY处设置内存断点,同时自动将bMark设置为TRUE,后面再执行到此的时候就不会停下来。如此只需要一次手动操作即可达成设置断点的效果。
实在是懒出了风格之举。 :-D