GFlags 和 PageHeap

此版本的 GFlags 包括 PageHeap (pageheap.exe) 的功能,该工具可在 Windows 中启用堆分配监视。 PageHeap 使 Windows 功能能够在每个分配的边界保留内存,以检测超出分配的内存访问尝试。

GFlags 中的页堆选项允许你选择 标准堆验证,该验证在每个堆分配结束时写入填充模式,并在释放分配时检查模式,或者 整页堆验证,这将在每个分配结束时放置一个不可访问的页面,以便程序在访问超出分配的内存时立即停止。 由于完整堆验证对每个分配使用整页内存,因此其广泛使用可能会导致系统内存不足。

  • 若要为所有进程启用标准页面堆验证,请使用 gflags /r +hpagflags /k +hpa

  • 若要为一个进程启用标准页堆验证,请使用 gflags /p /enableImageFileName

  • 若要为一个进程启用整页堆验证,请使用 gflags /iImageFileName+hpagflags /p /enableImageFileName/full

/k 之外的所有页面堆设置都存储在注册表中,并在更改之前保持有效。

请注意,只有在启动映像之前启用了 PageHeap 验证时,PageHeap 功能才处于活动状态。 对于长时间运行的进程(例如生产环境中的用于 IIS 的 W3WP),这意味着在重启进程之前不会开始验证。 同样,如果在进程运行时禁用 PageHeap,则验证将继续,直到进程重启。 当进程正在运行或未运行时,重复发出相同的 GFlags 命令不会产生其他效果。 这意味着,使用 GFlags 命令启用 PageHeap 是幂等的。

在进程终止和系统重启之间,PageHeap 配置也是永久性的。 系统重启可用于在配置所需的 PageHeap 设置后重新初始化进程,但一旦启用该功能,系统重启就不能用于禁用该功能。 必须显式禁用 PageHeap。

在解释“GFlags”对话框中图像文件的“启用页面堆检查”框时,请谨慎操作。 它指示为图像文件启用了页面堆验证,但不指示它是完整页堆验证还是标准页堆验证。 如果选择“检查”框检查结果,则会为映像文件启用整页堆验证。 但是,如果检查使用命令行接口,则检查可以表示为图像文件启用完整页堆验证或标准页堆验证。

若要确定是否为程序启用完整页堆验证或标准页堆验证,请在命令行中键入 gflags /p。 在生成的显示中, 跟踪 指示为程序启用了标准页堆验证, 完整跟踪 指示为程序启用了整页堆验证。