全局(或全程)标志编辑器是Sppuort Tools提供的一个适用与CW2KP的实用工具,在前面介绍查找内存空洞的文章中曾经提到过它。那么,所谓“标志(Flag)”的含义是什么呢?我们可以先粗略地将其理解为"对操作系统环境的设置".这种全局标志编辑可以被管理员用来对系统进行修改设置,也可以用来进行系统诊断。从该工具的使用特点和用途上,也可以体现出这一点.这个工具还可以与别的工具相配合,作为其它工具的先导,例如,使用查找内存空洞的工具就需要首先启动标志编辑器.另一个特点是:这个工具必须在加载后进行一次重新启动才能使用,这一点与别的工具明显不同.该工具也是在两种环境中各具备一个版本.无论那种版本,有很多可供选择的项目,项目对应的就是注册表中的特定键值,而对这些项目的选择操作实际是对注册表键值的修改,键值的修改会使系统内部的某些功能被打开或禁止,程序就是利用这一点来对系统进行诊断或排除故障的.下面先介绍在CW2KP中使用的GUI界面版本的标志编辑器.
1. GUI版本介绍
如果你已经安装"Support Tools",打开该程序可以使用:"开始->程序->Support Tools->Tools-> Global Flags Editor",附图是打开程序后出现的对话框,对话框上的彩色矩形或椭圆框是我为方便讨论自己加上去的.
附图:
在目的(Destination)选项卡中,你可以进行三项选择:
1、系统注册表
2、内核模式
3、图标文件(image file)三个选项都是单选,每次只能选择一个.选择第一项是对注册表的修改,当然这些修改很有限,并主要围绕诊断系统故障而设置,同平时我们为优化系统进行的注册表修改不是一回事;对注册表的修改,需要重新启动计算机之后才可以生效。选择第二项是启用内核模式。选择第三项可以修改图标,要在image file name 编辑栏中指定图标文件的名称;同时,在Command Line 编辑栏中指定该图标代表的应用程序,这很像我们熟悉的更改图标操作。不论选择哪个项目,都可以使用“Launch”按钮来启动设置。
目的框以下是可供选择的项目,所有选项的作用,在对话框的选择框旁都附有比较完整的英文说明,这些说明文字与表1的第二列中基本是相对应的,中文含义可以参考表1中第三列对应的部分。表1中的最左边一列是英文说明的缩写,这些缩写也是命令行版本中相应的参数。应当注意的是,表1中列出的有些项目,在对话框中并没有对应的选择框可用,也就是说,这些开关只能用在命令行版本中.凡属这些,都在表中都以蓝色的字体列出.同样,有些对话框中已经有的选择框,在表中也找不到对应的说明,这也意味着该项只能运行在GUI版本下.属这一类的补充在表1的下面.表中或表外说明中的名词术语的含义不属于本文讨论的范围,需要了解时各位可以参考相关的资料.并欢迎对其中的不妥乃至错误进行指正.
选择框分成五组,第二和第三组在用途上基本可以归为一类,所以我将五组划分成四类,每一类用一种颜色的矩形框分开。蓝色矩形框中共包含3项,这都是与调试有关的选项,其意义也比较明显; 粉红色框中包含10项,这些项大部分与内存管理有关;绿色矩形框也是与程序调试有关的选项,只是关联的内容同第一类不一样;红色矩形框中的项目比较杂,分属于多个方面;但总起来说,所有的选项都是围绕诊断调试设置的.
椭圆框中的项目是选择跟踪捕捉的层数,默认是16层,你可以修改为别的数值.
右下方的矩形框是内核模式下特定内存池标记的选择,可以选择文本,也可以选择十六进制数,内容可以填写在给出的编辑框中.然后在两种检验模式中指定一种.
完成上述各项选择后,鼠标点击Apply或Ok即可.
无论使用何种版本的全局标志编辑器,都必须对命令、参数、开关做到真正了解,盲目乱用会产生程序冲突或在重新启动计算机时失败.
2.命令行版本介绍
命令行版本与GUI版本基本是一一对应的.也是由参数和开关组成的.
命令行的语法:
gflag [-r [flag [maxdepth]] [-k [flag]] [-i ImageFileName [flag]] [-l flag commandline...]
参数及开关说明:
开关:flag
即表1中有效的全局标志
flag应当是下面形式:
A:一个十六进制数的全局标志.如果使用时需要查找含义,可以参考表2中的内容,表1和表2实际是同一个标志的两种表达形式.
B:字符串,也就是表1中最左边一列中的缩写.
C:如果同时使用多个开关,可以使用"+"号与"-"号来进行连接.这与同时在附图中进行多项选择类似.
参数:
-r [flag] [maxdepth]
显示当前系统的注册表设置,
-k [flag] 运行内核模式
-i ImageFileName [flag]
加载的image 文件名
-l [flag commandline]
启动指定的设置项,相当与点击上面的“Launch”按钮.
有效的全局标志的缩写及含义(表1)
缩写
英文
含义说明
Kst
Create kernel mode stack trace database
建立kernel模式下内存堆的跟踪数据库
Ust
Create user mode stack trace database
建立user(用户)模式下内存堆的跟踪数据库
Dic
Debug Initial Command
Debug初始化命令
Dwl
Debug WINLOGON
Debug WINLOGON
Dhc
Disable Heap Coalesce on Free
禁止在自由内存空间的堆合并
Ddp
Disable kernel mode DbgPrint output
禁用kernel模式的debug打印输出
Dps
Disable paging of kernel stacks
禁止内核堆栈分页
Dpd
Disable protected DLL verification
禁止DLL保护的确认
Ece
Enable Close Exception
允许关闭异常程序
d32
Enable debugging of Win32 Subsystem
允许win32子系统的调试程序
Eel
Enable Exception Logging
允许例外程序登录
Hat
Enable Heap API Call Tracing
允许API堆的跟踪调用
Hfc
Enable heapfree checking
允许自由堆检查
Hpc
Enable heap parameter checking
允许堆参数检查
Htg
Enable heap tagging
允许标记堆
Htd
Enable Heap Tagging By DLL
允许DLL标记堆
Htc
Enable heap tail checking
允许堆尾部检查
Hvc
Enable heap validation on call
允许堆调用的确认
Ksl
Enable loading of kernel debugger symbols
允许装载内核Debug符号
Eot
Enable Object Handle Type Tagging
允许标记对象句柄类型
Pfc
Enable pool free checking
允许检查自由内存池
Ptg
Enable pool tagging
允许标记内存池
Ptc
Enable pool tail checking
允许内存池尾部检查
Otl
Maintain a list of objects for each type
维修每个类型的对象的列表
Hpa
Place heap allocations at ends of pages
堆分配放在页的结束位置
Sls
Show Loader Snaps
显示加载的捕捉
Soe
Stop On Exception
停止异常程序
补充:Buffer DbgPrint output:debug缓冲区打印输出
表2:标志名称对应的十六进制数:
标志名称
十六进制数
FLG_STOP_ON_EXCEPTION
0x00000001
FLG_SHOW_LDR_SNAPS
0x00000002
FLG_DEBUG_INITIAL_COMMAND
0x00000004
FLG_STOP_ON_HUNG_GUI
0x00000008
FLG_HEAP_ENABLE_TAIL_CHECK
0x00000010
FLG_HEAP_ENABLE_FREE_CHECK
0x00000020
FLG_HEAP_VALIDATE_PARAMETERS
0x00000040
FLG_HEAP_VALIDATE_ALL
0x00000080
FLG_POOL_ENABLE_TAIL_CHECK
0x00000100
FLG_POOL_ENABLE_FREE_CHECK
0x00000200
FLG_POOL_ENABLE_TAGGING
0x00000400
FLG_HEAP_ENABLE_TAGGING
0x00000800
FLG_USER_STACK_TRACE_DB
0x00001000
FLG_KERNEL_STACK_TRACE_DB
0x00002000
FLG_MAINTAIN_OBJECT_TYPELIST
0x00004000
FLG_HEAP_ENABLE_TAG_BY_DLL
0x00008000
FLG_IGNORE_DEBUG_PRIV
0x00010000
FLG_ENABLE_CSRDEBUG
0x00020000
FLG_ENABLE_KDEBUG_SYMBOL_LOAD
0x00040000
FLG_DISABLE_PAGE_KERNEL_STACKS
0x00080000
FLG_HEAP_ENABLE_CALL_TRACING
0x00100000
FLG_HEAP_DISABLE_COALESCING
0x00200000
FLG_ENABLE_CLOSE_EXCEPTIONS
0x00400000
FLG_ENABLE_EXCEPTION_LOGGING
0x00800000
FLG_ENABLE_HANDLE_TYPE_TAGGING
0x01000000
FLG_HEAP_PAGE_ALLOCS
0x02000000
FLG_DEBUG_INITIAL_COMMAND_EX
0x04000000
FLG_VALID_BITS
0x07FFFFFF