|
全局(或全程)标志编辑器是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 |
|