这部分是编程/调试相关的,部分是与外部操作系统相关的(超级用户候选人?),但无论如何我都在这里发布,因为如果有人应该知道答案,那就在这里.
我突然开发了一个程序,一个新版本(没有重大变化)导致一切都停止了.我对它进行了分析,看看花了多少时间,但%分布是正常的 - 所有事情都花了很长时间.
使用Very Sleepy通过callstack进行研磨,我注意到free/malloc/delete/realloc占运行时的95%以上.怀疑堆损坏,我回滚了所有更改,但没有任何改变.
使用MSVC的分析器,我挖出了调用堆栈,超出了malloc/realloc,并且令人惊讶地 - 在一个名为Acxtrnal.dll的外部dll上结束了.这是一个堆栈的剪辑:http://i.imgur.com/0xXv5MV.png
显然,一些外部dll正在挂钩我的程序的堆验证程序.这让我有点焦虑.谷歌搜索dll只显示其中的一个官方来源(关于兼容性模式;不相关):https://support.microsoft.com/en-us/kb/2272691
在难以置信地花了半天调试后,问题就消失了.看起来这个人有同样的问题,虽然'答案'可能是无关的:在分析我的fortran程序时,Acxtrnal.dll是使用大部分CPU时间的部分!那是什么dll.
当然,现在,我既好奇又担心这个问题; 它是否会回归 - 为什么它会在第一种情况下发生?如果有人经历过类似的事情,我将不胜感激,因此我们可以阐明这个问题.即使这个问题看起来很少见,也许它会帮助那些人.
感谢您的集体帮助.供将来参考(和Google员工):
该问题是由Windows容错堆引起的:https://msdn.microsoft.com/en-us/library/windows/desktop/dd744764(v = vs.85).aspx
当您设法将堆损坏到某种未知程度时,它是一个特定于进程的服务.目前尚不清楚如何再次完全禁用该服务; 有人说重命名api dll(在\ windows\apppatch\acxtrnal.dll中找到),或通过注册表禁用它.
在我的情况下,我的程序是一个插件dll,并且显然我解决了在另一个程序中托管dll的问题.
更多信息可以在评论中找到,在这里:http: //billroper.livejournal.com/960122.html
如何关闭容错堆?