GFlags 和 PageHeap
此版本的 GFlags 包括 PageHeap (pageheap.exe)的功能,该工具可在 Windows 中启用堆分配监视。 PageHeap 支持在每个分配边界保留内存的 Windows 功能,以检测访问超出分配的内存尝试。
GFlags 中的页面堆选项允许你选择 标准堆验证,该验证会在每个堆分配结束时写入填充模式,并检查分配释放时模式,或 全页堆验证,这将在每个分配结束时放置不可访问的页面,以便程序在访问超出分配的内存时立即停止。 由于完整堆验证对每个分配使用整页内存,因此其广泛使用可能会导致系统内存短缺。
若要为所有进程启用标准页堆验证,请使用 gflags /r +hpa 或 gflags /k +hpa。
若要为一个进程启用标准页堆验证,请使用 gflags /p /enable ImageFileName。
若要为一个进程启用整页堆验证,请使用 gflags /i ImageFileName +hpa 或 gflags /p /enable ImageFileName /full。
除 /k 之外的所有页面堆设置都存储在注册表中,并且一直有效,直到更改它们。
请注意,仅当启动映像之前启用了 PageHeap 验证时,PageHeap 功能才处于活动状态。 对于长时间运行的进程(例如生产环境中的用于 IIS 的 W3WP),这意味着在重启进程之前不会开始验证。 同样,如果在进程运行时禁用 PageHeap,验证将继续,直到重新启动进程。 重复发出相同的 GFlags 命令,同时进程正在运行或不运行,没有其他效果。 因此,使用 GFlags 命令启用 PageHeap 是幂等的。
PageHeap 配置在进程终止和系统重启时也持续存在。 系统重启可用于在配置所需的 PageHeap 设置后重新初始化进程,但在启用该功能后不能用于禁用该功能。 必须显式禁用 PageHeap。
在解释 GFlags 对话框中图像文件的“启用页面堆 ”复选框时使用注意。 它指示为图像文件启用了页面堆验证,但它不指示它是完整还是标准页面堆验证。 如果选中该复选框的复选结果,则会为图像文件启用整页堆验证。 但是,如果使用命令行接口的检查结果,则检查可以表示为图像文件启用完整页堆验证或标准页堆验证。
若要确定是否为程序启用了完整页堆验证或标准页堆验证,请在命令行中键入 gflags /p。 在生成的显示中, 跟踪 指示为程序启用了标准页堆验证,完整 跟踪 指示为程序启用了整页堆验证。