花在空闲/malloc、外部内存挂钩上的时间太长了
Insane amount of time spent in free/malloc, external memory hooks?
这部分与编程/调试有关,部分与外部操作系统有关(候选超级用户?),但我还是把它发布在这里了,因为如果有人知道答案的话,它就在这里。
我正在开发一个程序,突然,一个新的构建(没有重大更改)导致一切都停止了。我对它进行了分析,看看什么需要时间,但%分布是正态的-所有都需要更长的时间。
在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
如何关闭容错堆?
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 随着时间的推移,我的程序越来越慢,我不知道为什么.内存泄漏
- 多次分配内存是否一次性需要更多时间?
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 如何在 ubuntu 上的 php 脚本中获取程序(c,c++,java,python,php)的执行时间和内存使用量?
- C 获得运行时间和内存使用量
- 如何在以下C程序中计算运行时间内存和最大数据存储器使用情况
- 加载时间,遍历时间,不同数据段C/C 的内存使用率
- 持续的时间访问是否在某个时候意味着连续内存
- 运行时间内存分配错误
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- 从文件读取/写入时出现内存和时间问题
- 在O(n)时间O(n)内存中计算最大(a [i.i d]))
- 如何使用任意数量的(编译时间确定的)容器创建一个内存池
- 对于长时间运行的程序,STL 内存管理是否"reliable"?
- 在内存使用或编译时间方面更好的是什么
- 为什么我在一段时间后不断出现MySQL客户端内存不足错误.
- 是否需要解除分配本地时间的内存
- odeint内存使用情况和执行时间
- 保存未知数量的整数,而不会花费太多时间/内存