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

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

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

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

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 /?

参数

标志
使用表示调试 (的 FlagHex) 或 (十 六进制值) 一个三字母缩写形式。 缩写和十六进制值列在 GFlags 标志表中

使用以下标志格式之一:

格式 说明

{ + | - }Flag提供

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

[ + | - ]FlagHex

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

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

/r
注册表。 显示或更改存储在注册表中的系统范围的调试标志。 这些设置在重启时生效Windows并一直有效,直到更改它们。

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

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

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

/i
图像文件设置。 显示或更改特定进程的调试标志。 这些设置存储在注册表中。 它们对于此过程的所有新实例都有效,并且它们一直有效,直到你更改它们。

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

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

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

spp
(Windows Vista 和 later.) 设置或清除特殊池功能。 有关示例,请参阅 示例 14:配置特殊池

PoolTag
(Windows Vista 和 later.) 指定特殊池功能标记。 仅与 spp 标志 一同使用。

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

0x大小
(Windows Vista 和 later.) 指定特殊池功能的大小范围。 仅与 spp 标志 一同使用。 有关选择大小值的指南,请参阅特殊池中的"选择分配大小"。

/ro
启用、禁用并显示注册表中的对象 引用 跟踪设置。 若要对此设置进行有效更改,必须重启Windows。

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

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

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

/t PoolTags

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

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

如果指定多个池标记,Windows指定池标记 跟踪对象。

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

/i ImageFile

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

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

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

/d

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

/p

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

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

在没有其他参数的情况下 ,/ko 在对象引用跟踪 (运行时) 内核标志。

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

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

/t PoolTags

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

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

如果指定多个池标记,则Windows指定池标记跟踪对象。

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

/i ImageFile

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

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

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

/d

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

/p

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

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

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

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

/disable ImageFile
为指定的映像文件 (标准或) 页堆验证。

此命令等效于关闭进程 ( gflags /i ImageFile -hpa) ) 的进程的"启用页堆" (hpa) 。 可以互换使用命令。

/enable ImageFile
为指定的映像文件启用页堆验证。

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

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

使用此参数相当于为进程启用页堆 ( hpa) 标志 (gflags /i ImageFile +hpa) 。 可以互换使用命令。

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

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

概率 是一个从 0 到 100 的小数整数,表示整页堆验证的概率。 100 的概率与使用 /full 参数的概率相同。 0 的概率与使用标准页堆验证的概率相同。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/fault
强制程序的内存分配按指定的速率失败,并在指定的超时时间之后失败。

此参数 (称为 "错误注入" 的做法将堆分配错误插入到所测试的映像文件中 ) 这样,某些内存分配将会失败,当程序在内存不足的情况下运行时可能会发生这种情况。 此测试可帮助检测处理分配失败时出现的错误,例如未能释放资源。

费率

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

TimeOut

确定程序的开始与错误注入例程的开头之间的时间间隔。

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

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

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

/protect
保护堆内部结构。 此测试用于检测随机堆损坏。 这会使执行速度大大降低。

/no _ 同步
检查不同步的访问。 如果此参数检测到使用堆创建的堆,则不会对 _ _ 其他线程访问任何序列化标志。

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

/no _ 锁定 _ 检查
禁用临界区验证程序。

/?
显示 GFlags 的帮助。 带有 /p/? 显示 GFlags 中的页堆验证选项的帮助。

备注

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

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

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

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

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

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

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

/Enable 参数为注册表中的映像文件设置 启用页堆 (hpa) 标志。 但是,在默认情况下, /enable 参数会为映像文件启用 标准 堆验证,这不同于 /i 参数和 + hpa 标志,后者将为映像文件启用 完全 堆验证。

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

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

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

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

此版本的 GFlags 包含 -v 选项,这将启用为 GFlags 开发的功能。 不过,这些功能尚未完成,因此没有记录。