windows下野指针的debug方法

Posted 长空小鹰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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调用中崩溃,让人无从查起。

接下来非常顺利地发现了问题:一个变量类型变了,但代码中声明的指针还是旧的,调用了不同的类的函数,于是查找了超出范围的内存。

以上是关于windows下野指针的debug方法的主要内容,如果未能解决你的问题,请参考以下文章

C 语言指针数据类型 ( 野指针 | 避免野指针推荐方案 )

qt qdebug正常releasd异常

面试题野指针的成因,危害以及避免方法?

iOS 野指针和空指针

空指针——野指针——内存泄漏

空悬指针和野指针