在free / malloc,外部内存挂钩上花费了多少时间?

时间:2016-01-08 00:18:05

标签: c++ windows memory-management

这部分是编程/调试相关的,部分是与外部操作系统相关的(SuperUser候选人?),但无论如何我都在这里发布,因为如果有人知道答案,那就在这里。

我突然开发了一个程序,一个新版本(没有重大变化)导致一切都停止了。我对它进行了分析,看看花了多长时间,但%分布是正常的 - 一切只花了不少时间。

使用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

在难以置信地花了半天调试后,问题就消失了。看起来这个人有同样的问题,虽然答案是'可能不相关:When profiling my fortran program, Acxtrnal.dll is the part using most of the CPU time! What is that dll.?

现在,我当然既好奇又担心这个问题;它是否会回归 - 为什么它会在第一种情况下发生?如果有人经历过类似的事情,我将不胜感激,因此我们可以阐明这个问题。即使这个问题看起来很少见,也许它会帮助那些人。

1 个答案:

答案 0 :(得分:7)

感谢您的集体帮助。供将来参考(和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

How do I turn off the fault tolerant heap?