windows下野指针的debug方法
项目中,出现莫名其妙的崩溃,错误为:
xxxx modified at xxxafter it was freed
断点位置在一个析构函数中,而经过检查,这个类没有问题,并不是析构已经被析构的类。
痛苦之下,搜索了一个工具:gfrag.exe
调用:./gflags.exe -p /enable 程序名.exe /full 此处不需要指定具体路径。
这个工具其实只是设置了注册表,将:
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\程序名.exe中设置一个
GlobalFlag REG_SZ 0x02000000
PageHeapFlags REG_SZ 0x3
因此也可以自己手设。shell在运行程序时,会用完全页堆来进行程序内存分配,这样的内存,当发生野指针访问或越界访问时会产生异常。
如果不设置这个,野指针访问和越界访问不会产生异常,于是就不会当场崩溃,而是在下一个free或malloc调用中崩溃,让人无从查起。
接下来非常顺利地发现了问题:一个变量类型变了,但代码中声明的指针还是旧的,调用了不同的类的函数,于是查找了超出范围的内存。