花在空闲/malloc、外部内存挂钩上的时间太长了

Insane amount of time spent in free/malloc, external memory hooks?

本文关键字:时间 内存 malloc 外部      更新时间:2023-10-16

这部分与编程/调试有关,部分与外部操作系统有关(候选超级用户?),但我还是把它发布在这里了,因为如果有人知道答案的话,它就在这里。

我正在开发一个程序,突然,一个新的构建(没有重大更改)导致一切都停止了。我对它进行了分析,看看什么需要时间,但%分布是正态的-所有都需要更长的时间。

在Very Sleepy的调用堆栈中,我注意到free/malloc/delete/realloc占运行时的95%以上。怀疑堆损坏,我回滚了所有更改,但没有任何更改。

使用MSVC的探查器,我挖掘了malloc/realloc之外的调用堆栈,并意外地在一个名为Acxtrnal.dll的外部dll处结束。以下是堆栈片段:https://i.stack.imgur.com/OgNNx.png

很明显,一些外部dll正在连接到我的程序的堆验证过程中。这让我有点焦虑。在谷歌上搜索dll只会发现它的一个官方来源(关于可压缩性模式;不相关):https://support.microsoft.com/en-us/kb/2272691

在难以置信地调试了半天之后,问题消失了。这家伙似乎也有同样的问题,尽管"答案"可能无关:在分析我的fortran程序时,Acxtrnal.dll是占用大部分CPU时间的部分!那个dll是什么。?

当然,现在我对这个问题既好奇又担心;它是否会再次出现——为什么会出现在第一种情况下?如果有人经历过类似的事情,我将不胜感激,这样我们就可以了解这个问题。尽管这个问题看起来很罕见,但也许它会帮助一些人。

感谢大家的集体帮助。供未来参考(和谷歌员工):

该问题是由Windows容错堆引起的:https://msdn.microsoft.com/en-us/library/windows/desktop/dd744764(v=vs.85).aspx

当您设法破坏堆到某种未知程度时,它是一个特定于进程的服务。目前还不知道如何再次禁用该服务;有人说重命名api dll(位于\windows\apppatch\acxternal.dll中),或者通过注册表禁用它。

在我的情况下,我的程序是一个插件dll,显然我解决了在另一个程序中托管dll的问题。

更多信息可以在评论中找到,点击此处:http://billroper.livejournal.com/960122.html

如何关闭容错堆?