【发布时间】:2014-02-06 11:24:43
【问题描述】:
我一直在研究我们在 Windows XP 嵌入式系统上的应用程序中看到的一个相当难以捉摸的错误。
我们已将错误范围缩小到应该指向内存块的指针,而不是指向 NULL。由于内存是通过未检查的 malloc(..) 调用分配的,我的直觉认为 malloc 失败并返回 NULL(尽管我们现在也在寻找其他可能性,例如可能无意中改变指针)。这是本机 C++ 应用程序。追查到这个原因的崩溃有点复杂,主要是因为我们只有事后崩溃转储,并且故障表现在我们没有源代码的第三方库中,在不同的线程上。欢乐时光:)
我的问题集中在内存耗尽的可能性上。重要的是我们运行的 XP Embedded 系统禁用了它的页面文件。
所以,我有三个问题;如果有人能为我澄清这些,那就太好了:
首先,没有分页文件意味着什么?这是否意味着当堆增长时,即使没有立即使用这些空闲块,操作系统也需要立即找到并分配新内存?我看过一些关于它的轶事提及,但找不到任何关于禁用页面文件的确切影响的具体信息。
为什么 Microsoft 决定在 Windows Vista 之前默认不启用低碎片化堆?在 Windows XP 上为您的进程启用 LFH 是否存在危险?
WinDbg 中的“外部碎片”和“虚拟地址碎片”有什么区别?
WinDbg 报告受影响堆上的堆统计信息如下:
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast
(k) (k) (k) (k) length blocks cont. heap
04770000 00001002 1621948 94844 1608284 102 6 8068 6 2 L
Virtual address fragmentation 94 % (8068 uncommited ranges)
【问题讨论】:
-
没有分页文件对堆损坏错误或碎片没有任何影响。 this KB article 很好地涵盖了 LFH。
标签: c++ winapi heap-memory virtual-memory