c++ - 在 free/malloc、外部内存 Hook 上花费了大量时间?

标签 c++ windows memory-management

这部分与编程/调试相关,部分与外部操作系统相关( super 用户候选人?),但我还是将其发布在这里,因为如果有人应该知道答案,它就在这里。

我正在开发一个程序,突然,一个新的构建(没有重大变化)导致一切都停止了。我对它进行了剖析以查看花费的时间,但 % 分布是正常的 - 一切 只是花费了更长的时间。

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

使用 MSVC 的探查器,我深入挖掘了调用堆栈,超出了 malloc/realloc 并且令人惊讶地结束于一个名为 Acxtrnal.dll 的外部 dll。这是堆栈的剪辑:http://i.imgur.com/0xXv5MV.png

很明显,一些外部 dll Hook 到我程序的堆验证过程中。这让我有点焦虑。谷歌搜索 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.?

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

最佳答案

感谢大家的共同帮助。供将来引用(和 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?

关于c++ - 在 free/malloc、外部内存 Hook 上花费了大量时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667542/

相关文章:

c++ - 在控制台应用程序中存储加密数据

windows - Windowsinstaller 中的 Autogen guid (*) 导致 ICE08 错误

c++ - 如何将 vector 的第一个元素移动到另一个 vector 的末尾

c++ - clang-tidy 10 忽略了我的 NOLINT 命令

Linux 中的 C 代码到 Windows 中的 C 代码

ios - 在 UIWebView 中加载 NSURLRequest - 堆不断增长

ios - 如何判断一个对象是否已经被释放

c++ - 在 C++ 中指向同一个内存块的数组?

c++ - 如何在 Python + SWIG 中接收引用和指针参数?

python - 如何在所有操作系统中使用 pygame 播放声音?