最近代码出了bug,堆溢出。 debug下一切正常, release时随机崩溃到某几个地方,
报错是: Critical error detected c0000374
不是完全随机崩溃,崩溃到某几个正常的地方,开始怀疑是不是这几个地方真的有什么bug,
由于使用了qt库,炸到qt函数调用最后崩溃到系统dll中,根本无法调试,最后发现了一个神器
就是 WinDbg自带的工具软件 gflags, 通过这个软件可以修改注册表让程序运行时,系统runtime分配内存时额外再前后多分配两个字节,并且填充0xfd(貌似是这个),当程序内存发生溢出时写到
额外分配的内存时就直接终端。 gflags工具下载。这个再WindowsSDK中包含了,如果没有可以去
微软官网单独下载这个sdk安装时只安装调试工具,安装完成后的路径:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
打开里面的gflags.exe 切换到如下图选择 Image File, 注意exe只需要
文件名不需要完整路径。 下面Debugger可以不选,我选了之后有报错,
然后用vs正常启动release来调试就可以定位到,另外如果无法定位。可以
把下面的几个Enable xxx checking都勾选试试,不过这样程序运行会变很慢,
调试完记得在注册表中删除这些设置,否则程序一直运行很慢。
注册表路径是:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/WindowsNT/CurrentVersion/Image File Execution Options/mytest.exe
有时间研究下Windbg这个,有非常多的调试工具有助于定位bug。
也可参考这几篇博客: