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 /iImageFile 会显示为指定进程设置的标志。

/tracedbSizeInMB
设置进程的用户模式堆栈跟踪数据库的最大大小。 若要使用此参数,必须为进程设置 创建用户模式堆栈跟踪数据库 (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 会在注册表中显示对象引用跟踪设置。

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

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

/tPoolTags

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

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

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

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

/iImageFile

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

输入最多 64 个字符的图像文件名,例如notepad.exe。 “System”和“Idle”不是有效的映像名称。

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

/d

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

/p

永久。 跟踪数据将一直保留到禁用对象引用跟踪或计算机关闭或重启为止。 默认情况下,销毁对象时,对象的跟踪数据将被丢弃。

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

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

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

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

/tPoolTags

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

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

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

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

/iImageFile

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

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

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

/d

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

/p

永久。 跟踪数据一直保留到禁用对象引用跟踪,或者计算机关闭或重启。 默认情况下,销毁对象时,对象的跟踪数据将被丢弃。

/P
为进程设置页面堆验证选项。

在没有其他参数的情况下, gflags /p 显示为其启用了页堆验证的图像文件列表。

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

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

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

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

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

/全
为进程启用整页堆验证。 整页堆验证在每个分配的末尾放置一个保留虚拟内存区域。

使用此参数等效于为 (gflags /iImageFile+hpa) 的进程启用页堆 (hpa) 标志。 可以互换使用命令。

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

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

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

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

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

/addressAddressStart AddressEnd
当指定地址范围内的返回地址位于运行时调用堆栈上时,为分配的内存启用全页堆验证。 它允许进程对所有其他分配进行标准页堆验证。

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

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

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

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

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

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

默认情况下,此参数使用具有命令行 ntsd -g -G -x 且启用了页面堆的 NTSD 调试器,但可以使用 DebuggerCommand 变量指定不同的调试器和命令行。

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

此选项适用于难以从命令提示符启动的程序以及由其他进程启动的程序。

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

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

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

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

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

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

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

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

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

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

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

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

费率

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

TimeOut

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

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

/泄漏
检查进程结束时的堆泄漏。

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

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

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

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

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

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

备注

键入不带参数 的 gflags 将打开 “全局标志 ”对话框。

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

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

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

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

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

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

/enable 参数为注册表中的映像文件设置 enable page heap (hpa) 标志。 但是,/enable 参数默认启用图像文件的标准堆验证,这与具有 +hpa 标志的 /i 参数不同,后者为图像文件启用完整堆验证。

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

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

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

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

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