这部分是编程/debugging相关的,部分是与外部操作系统相关的(超级用户候选人?),但是我把它贴在这里,因为如果有人知道答案,就在这里。
我正在开发一个程序,突然间,一个新的版本(没有大的变化)导致一切都停下来。 我想知道需要花费多less时间,但是分配百分比是正常的 – 所有的花费都花了很长时间。
通过非常昏昏沉沉的调用堆栈,我注意到free / malloc / delete / realloc占了95%的运行时间。 怀疑堆腐败,我回滚了所有的变化,但没有改变。
使用MSVC的分析器,我挖掘调用堆栈,超越malloc / realloc,并结束 – 令人惊讶的是 – 在外部DLL名为Acxtrnal.dll 。 这里是一个堆栈的剪辑: http : //i.imgur.com/0xXv5MV.png
所以显然,一些外部DLL挂钩到我的程序的堆validation程序。 这让我感到有些焦虑。 使用谷歌searchDLL只揭示了一个正式的来源(有关compability模式;不相关): https : //support.microsoft.com/en-us/kb/2272691
经过半天的怀疑debugging,问题消失了。 看起来这个人有同样的问题,虽然“答案”可能是无关的: 当我的Fortran程序分析,Acxtrnal.dll是使用大部分CPU时间的部分! 那是什么DLL?
当然,我对这个问题既好奇又担心, 是否会返回 – 为什么发生在第一个案件? 如果有人经历过类似的事情,我将不胜感激,所以我们可以把这个问题说清楚。 即使这个问题似乎很less,也许会帮助那里的人。
感谢集体的帮助。 供将来参考(和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
如何关闭容错堆?