首页 > 解决方案 > 为什么在 64 位 Windows 下使用 ApplicationVerifier 进行堆调试时,会将 32 位进程限制为 2 GiB 的虚拟内存?

问题描述

我想使用 Windows 10 SDK(版本 10.0.18362.1)提供的 ApplicationVerifier 来加速调试在 64 位 Windows 10(内部版本 1909)下运行的 32 位应用程序中的(可能的)堆损坏。不幸的是,启用堆时使用 Basic 列表下的默认设置(并且仅启用该功能)的功能,一旦其内存使用量接近 2 GiB,应用程序就会耗尽内存,即使应用程序本身被编译为大地址感知。

无论我使用 Application Verifier x86 还是 Application Verifier x64 来激活堆检查,都会出现此问题。(而且我什至不确定这两个版本之间的区别是什么。)

我已经通过“帮助”菜单搜索了可用的文档,该菜单实际上非常广泛,但没有找到任何原因。我知道插入保护页面并将分配的开始或结束对齐到页面边界会增加内存消耗,但我不希望它将可用内存减少一半或以其他方式限制虚拟地址空间,至少在没有明确启用此类设置的情况下不会堆功能的选项。有谁知道这种行为的原因并且可以告诉我如何规避这个限制?

标签: debuggingmemoryheap-memory32bit-64bitapplication-verifier

解决方案


仅设置应用程序大地址标志是不够的。这是有道理的,好像系统还没有准备好,内核内存可能会超过 1GB 的限制,在这种情况下,您将有重叠的地址范围。 您需要使用 bcdedit 设置的正确标志重新启动操作系统。

命令应该是(我还没有实际测试过):

bcdedit /set increaseuserva 3078

推荐阅读