GFlags 命令概述

有关如何安装和查找gflags.exe的一般信息,请参阅 GFlags

可以互换使用 GFlags 命令和 全局标志对话框

GFlags 命令用法

若要使用 GFlags,请在命令行中键入以下命令。

打开 GFlags 对话框:

gflags

若要在注册表中设置或清除全局标志,请执行以下操作:

gflags /r [{+ | -}Flag [{+ | -}Flag...]]

设置或清除当前会话的全局标志:

gflags /k [{+ | -}Flag [{+ | -}Flag...]]

若要为映像文件设置或清除全局标志,请执行以下操作:

gflags /i ImageFile [{+ | -}Flag [{+ | -}Flag...]]
gflags /i ImageFile /tracedb SizeInMB

设置或清除特殊池功能(Windows Vista 及更高版本)

gflags {/r | /k} {+ | -}spp {PoolTag | 0xSize}

启用或禁用对象引用跟踪功能(Windows Vista 及更高版本)

gflags {/ro | /ko} [/p] [/i ImageFile | /t PoolTag;[PoolTag...]]
gflags {/ro | /ko} /d

若要启用和配置页面堆验证,请执行以下操作:

gflags /p /enable ImageFile  [ /full [/backwards] | /random Probability | /size SizeStart SizeEnd | /address AddressStart AddressEnd | /dlls DLL [DLL...] ] 
[/debug ["DebuggerCommand"] | /kdebug] [/unaligned] [/notraces] [/fault Rate [TimeOut]] [/leaks] [/protect] [/no_sync] [/no_lock_checks] 

若要禁用页面堆验证,请执行以下操作:

gflags /p [/disable ImageFile] [/?]

显示帮助:

gflags /?

参数


指定表示调试功能的三字母缩写(FlagAbbr)或十六进制值(FlagHex)。 缩写和十六进制值列在 GFlags 标志表中

使用以下标志格式之一:

格式 说明

{+ | -}FlagAbbr

设置 (+) 或清除 (-) 由标志缩写表示的标志。 如果没有加号(+)或减号(-),命令将不起作用。

[+ | -]FlagHex

添加 (+) 或减去 (-) 标志的十六进制值。 当其值包含在总和中时,将设置标志。 添加 (+) 是默认值。 输入表示单个标志的十六进制值(不含 0x),或输入多个标志的十六进制值之和。

ImageFile
指定可执行文件的名称,包括文件扩展名(例如,notepad.exe或mydll.dll)。

/r
注册表。 显示或更改存储在注册表中的系统范围的调试标志。 这些设置在重启 Windows 时生效,在更改这些设置之前保持有效。

如果没有其他参数, gflags /r 会在注册表中显示系统范围的标志。

/k
内核标志设置。 显示或更改此会话的系统范围的调试标志。 这些设置立即生效,但在 Windows 关闭时会丢失。 这些设置会影响此命令完成后启动的进程。

如果没有其他参数, gflags /k 将显示为当前会话设置的系统范围标志。

/我
图像文件设置。 显示或更改特定进程的调试标志。 这些设置存储在注册表中。 它们对于此过程的所有新实例都有效,在更改这些实例之前,它们仍然有效。

如果没有其他参数, gflags /i ImageFile 将显示为指定进程设置的标志。

/tracedb SizeInMB
设置进程的用户模式堆栈跟踪数据库的最大大小。 若要使用此参数, 必须为进程设置“创建用户模式堆栈跟踪数据库 ”(ust)标志。

SizeInMB 是一个整数,表示以十进制单位表示的兆字节数。 默认值为最小大小,8 MB;没有最大大小。 若要还原为默认大小,请将 SizeInMB 设置为 0。

spp
(Windows Vista 及更高版本)。设置或清除 特殊池 功能。 有关示例,请参阅 示例 14:配置特殊池

PoolTag
(Windows Vista 及更高版本)。指定特殊池功能的池标记。 仅用于 spp 标志。

输入 PoolTag 的四个字符模式,例如 Tag1。 它可以包括 (替换任何单个字符) 和 * (替换多个字符) 通配符。 例如,Fat* 或 Av?4。 池标记始终区分大小写。

0x大小
(Windows Vista 及更高版本)。指定特殊池功能的大小范围。 仅用于 spp 标志。 有关选择大小值的指南,请参阅特殊池中的“选择分配大小”。

/ro
在注册表中启用、禁用和显示 对象引用跟踪 设置。 若要使此设置生效,必须重启 Windows。

如果没有其他参数, /ro 会在注册表中显示对象引用跟踪设置。

若要启用对象引用跟踪,必须在命令中包含至少一个池标记(/t PoolTag)或一个映像文件(/i ImageFile)。 有关详细信息,请参阅 示例 15:使用对象引用跟踪

下表列出了对 /ro 有效的子参数。

/t PoolTags

将跟踪限制为具有指定池标记的对象。 使用分号 (;) 分隔标记名称。 输入最多 16 个池标记。

输入 PoolTags 的四个字符模式,例如 Tag1。

如果指定多个池标记,Windows 会跟踪具有任何指定池标记的对象。

如果未指定任何池标记,Windows 将跟踪映像创建的所有对象。

/i ImageFile

将跟踪限制为使用指定映像文件的进程创建的对象。 只能使用 /i 参数指定一个图像文件。

输入图像文件名(如notepad.exe),最多包含 64 个字符。 “系统”和“空闲”不是有效的映像名称。

如果未指定映像文件,Windows 将跟踪具有指定池标记的所有对象。 如果同时指定映像文件(/i)和一个或多个池标记(/t),Windows 会跟踪具有由指定映像创建的任何指定池标记的对象。

/d

清除对象引用跟踪功能设置。 与 /ro 一起使用时,它会清除注册表中的设置。

/p

永久。 在禁用对象引用跟踪或计算机关闭或重启之前,跟踪数据将保留。 默认情况下,当对象被销毁时,将放弃对象的跟踪数据。

/ko
启用、禁用和显示内核标志(运行时) 对象引用跟踪 设置。 对此设置的更改会立即生效,但在关闭或重启系统时会丢失。 有关详细信息,请参阅 示例 15:使用对象引用跟踪

如果没有其他参数, /ko 将显示内核标志(运行时)对象引用跟踪设置。

若要启用对象引用跟踪,必须在命令中包含至少一个池标记(/t PoolTag)或一个映像文件(/i ImageFile)。

下表列出了对 /ko 有效的子参数。

/t PoolTags

将跟踪限制为具有指定池标记的对象。 使用分号 (;) 分隔标记名称。 输入最多 16 个池标记。

输入 PoolTags 的四个字符模式,例如 Tag1。

如果指定多个池标记,Windows 会跟踪具有任何指定池标记的对象。

如果未指定任何池标记,Windows 将跟踪映像创建的所有对象。

/i ImageFile

将跟踪限制为使用指定映像文件的进程创建的对象。 只能使用 /i 参数指定一个图像文件。

如果未指定映像文件,Windows 将跟踪具有指定池标记的所有对象。

如果同时指定映像文件(/i)和一个或多个池标记(/t),Windows 会跟踪具有由指定映像创建的任何指定池标记的对象。

/d

清除对象引用跟踪功能设置。 与 /ro 一起使用时,它会清除注册表中的设置。

/p

永久。 在禁用对象引用跟踪或计算机关闭或重启之前,跟踪数据将保留。 默认情况下,当对象被销毁时,将放弃对象的跟踪数据。

/p
设置进程的页堆验证选项。

如果没有其他参数, gflags /p 将显示启用页面堆验证的图像文件列表。

页堆验证监视动态堆内存操作,包括分配操作和释放操作,并在检测到堆错误时导致调试器中断。

/禁用 ImageFile
关闭指定图像文件的页堆验证(标准或完整)。

此命令相当于关闭 进程的“启用页面堆 ”标志(gflags /i ImageFile -hpa)。 可以互换使用命令。

/使 ImageFile
为指定的图像文件启用页面堆验证。

默认情况下, /enable 参数会打开 图像文件的标准 页面堆验证。 若要为图像文件启用页堆验证,请将 /full 参数添加到命令,或使用带有 +hpa 标志的 /i 参数。

/满
为进程启用完整页面堆验证。 完整页堆验证在每个分配结束时放置一个保留虚拟内存区域。

使用此参数等效于打开进程(gflags /i ImageFile +hpa)的“启用页面堆”标志(hpa)。 可以互换使用命令。

/向后
将保留的虚拟内存区域放在分配的开头,而不是放在末尾。 因此,调试器捕获缓冲区开头的溢出,而不是缓冲区末尾的溢出。 仅对 /full 参数有效。

/随机 概率
根据指定的概率为每个分配选择完整或标准页堆验证。

Probability 是 0 到 100 之间的十进制整数,表示整页堆验证的概率。 概率为 100 与使用 /full 参数相同。 0 的概率与使用标准页堆验证相同。

/大小 SizeStart SizeEnd
为指定大小范围内的分配启用整页堆验证,并通过该过程为所有其他分配启用标准页堆验证。

SizeStartSizeEnd 是十进制整数。 默认值是所有分配的标准页堆验证。

/地址 AddressStart AddressEnd
为指定地址范围内的返回地址位于运行时调用堆栈上时分配的内存启用完整页堆验证。 它通过该过程为所有其他分配启用标准页堆验证。

若要使用此功能,请指定一个范围,其中包括调用具有可疑分配的函数的所有函数的地址。 当发生可疑分配时,调用函数的地址将位于调用堆栈上。

AddressStartAddressEnd 指定在分配堆栈跟踪中搜索的地址范围。 地址以十六进制格式指定,例如0xAABBCCDD。

在 Windows Server 2003 和更早的系统上, /address 参数仅在 基于 x86 的计算机上有效。 在 Windows Vista 上,它在所有受支持的体系结构上都有效。

/dlls DLL[ DLL...]
为指定的 DLL 请求的分配启用完整页堆验证,并为进程进行所有其他分配的标准页堆验证。

DLL 是二进制文件的名称,包括其文件扩展名。 指定的文件必须是执行过程中进程加载的函数库。

/调试
自动启动由 /enable 参数在调试器下指定的进程。

默认情况下,此参数将 NTSD 调试器与命令行 ntsd -g -G -x 和启用了页堆,但可以使用 DebuggerCommand 变量指定其他调试器和 命令行。

有关 NTSD 的信息,请参阅 使用 CDB 和 NTSD 进行调试。

此选项对于难以从命令提示符启动的程序和其他进程启动的程序非常有用。

DebuggerCommand
指定调试器和发送到调试器的命令。 此带引号的字符串可以包含调试器完全限定的路径、调试器名称和调试器解释的命令参数。 需要引号。

如果命令包含调试器的路径,则路径不能包含任何其他引号。 如果出现其他引号,命令 shell (cmd.exe) 将错误解释命令。

/kdebug
使用命令行 ntsd -g -G -x 在 NTSD 调试器下自动启动 /enable 参数指定的进程,启用页堆,并控制重定向到内核调试器 NTSD。

有关 NTSD 的信息,请参阅 使用 CDB 和 NTSD 进行调试。

/unaligned
在页面结束边界处对齐每个分配的末尾,即使这样做意味着起始地址未在 8 字节块上对齐。 默认情况下,堆管理器保证分配的起始地址在 8 字节块上对齐。

此选项用于检测逐个字节错误。 当此参数与 /full 参数一起使用时,预留虚拟内存的区域将在分配的最后一个字节之后开始,当进程尝试读取或写入超出分配的一个字节时,就会立即发生错误。

/decommit
此选项不再有效。 它已被接受,但被忽略。

Windows 2000 中包括的 PageHeap 程序(pageheap.exe),通过在分配后放置不可访问的页面来实现全页堆验证。 在该工具中 ,/decommit 参数替换了不可访问页的保留虚拟内存区域。 在此版本的 GFlags 中,始终使用保留虚拟内存区域来实现整页堆验证。

/notraces
指定不保存运行时堆栈跟踪。

此选项可稍微提高性能,但会使调试更加困难。 此参数有效,但不建议使用此参数。

/故障
强制程序内存分配按指定速率在指定超时后失败。

此参数将堆分配错误插入正在测试的映像文件中(称为“故障注入”的做法),以便某些内存分配失败,如程序在内存不足的情况下运行时可能出现的情况。 此测试有助于检测处理分配失败的错误,例如无法释放资源。

费率

指定从 1(.01%) 到 10000(1000%) 的十进制整数,表示分配失败的概率。 默认值为 100 (1%)。

TimeOut

确定程序开始和故障注入例程的开始之间的时间间隔。

TimeOut 以秒为单位。 默认值为 5(秒)。

/泄漏
检查进程结束时是否存在堆泄漏。

/leaks 参数禁用整页堆。 使用 /leaks 时将忽略修改 /full 参数的 /full 参数和参数,例如 /向后,GFlags 会执行标准页堆验证和泄漏检查。

/保护
保护堆内部结构。 此测试用于检测随机堆损坏。 这会使执行速度明显变慢。

/no_sync
检查是否未同步的访问。 如果此参数检测到使用HEAP_NO_SERIALIZE标志创建的堆被不同的线程访问,则会导致中断。

请勿使用此标志调试包含自定义堆管理器的程序。 同步堆访问的函数会导致页面堆验证程序报告不存在的同步错误。

/no_lock_checks
禁用关键节验证程序。

/?
显示 GFlags 的帮助。 使用 /p 时, /? 显示 GFlags 中页面堆验证选项的帮助。

备注

在没有参数的情况下键入 gflag 将打开“ 全局标志 ”对话框。

键入 不带其他参数的 gflags /p 将显示启用了页面堆验证的程序列表。

若要清除所有标志,请将 Flag 设置为 -FFFFFFFF。 (设置 标志 到 0 将零添加到当前标志值。它未清除所有标志。

将映像文件的标志设置为 FFFFFFFF 时,Windows 会清除所有标志并删除映像文件的注册表子项中的 GlobalFlag 条目。 子项保持不变。

页面堆 /enable 操作的 /full、/random/size/address/dlls 参数确定哪些分配受页面堆验证和使用验证方法的约束。 每个命令中只能使用这些参数之一。 默认值是进程的所有分配的标准页堆验证。 其余参数设置页面堆验证的选项。

GFlags 中的页面堆功能仅监视使用标准 Windows 堆管理器函数(HeapAlloc、GlobalAlloc、LocalAllocmallocnew、new[]或其相应解除分配函数)的堆内存分配,或使用调用标准堆管理器函数的自定义操作的堆内存分配。

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

/enable 参数为注册表中的映像文件设置“启用页堆”标志。 但是,/enable 参数默认为图像文件启用标准堆验证,这与带有 +hpa 标志的 /i 参数不同,该标志为图像文件启用完整堆验证。

标准 页堆验证会在分配结束时放置随机模式,并在释放堆块时检查模式。 完整 页堆验证在每个分配结束时放置一个保留虚拟内存区域。

完整页堆验证可以快速消耗系统内存。 若要为内存密集型进程启用全页堆验证,请使用 /size/dlls 参数。

使用全局标志进行调试后,提交 gflags /p /disable 命令以关闭页面堆验证并删除关联的注册表项。 否则,调试器读取的条目将保留在注册表中。 不能为此任务使用 gflags /i hpa 命令,因为它关闭页面堆验证,但不删除注册表项。

默认情况下,在 Windows Vista 和更高版本的 Windows 上,特定于程序的设置(图像文件标志和页面堆验证设置)存储在当前用户帐户中。

此版本的 GFlags 包括 -v 选项,这些选项支持为 GFlags 开发的功能。 但是,这些功能尚未完成,因此,不会记录这些功能。