cc682/NetRoc
http://netroc682.spaces.live.com/
!findxmldata
!findxmldata 从包含内核模式小内存转储文件的CAB文件中提取XML数据。
语法
!findxmldata [ -d DeviceName | -h HwId ]
!findxmldata -r Driver
!findxmldata -chksum [ -z CabFile ]
!findxmldata -v
参数
-d DeviceName
显示所有设备名包含DeviceName 指定的字符串的设备。
-h HwId
显示所有硬件ID包含HwId 指定的字符串的设备。如果同时使用-d 和-h,调试器仅显示两个都匹配的设备。
-r Driver
显示Driver 参数指定的驱动程序的信息,以及所有使用该驱动的设备。
-chksum
显示XML文件的校验和。
-z CabFile
对CabFile 参数指定的CAB文件进行一次校验和计算,而不是使用默认的Sysdata.xml文件中的。
-v
显示系统版本信息
DLL
Windows NT 4.0
|
Ext.dll
|
Windows 2000
|
Ext.dll
|
Windows XP和之后
|
Ext.dll
|
!findxmldata 扩展仅针对保存在CAB文件中的内核模式小内存转储文件。
注释
!findxmldata 扩展从包含内核模式小内存转储文件的CAB文件中的Sysdata.xml 文件提取数据。
不使用任何选项时,命令显示所有设备。
下面的例子说明了如何使用!findxmldata。
kd> !findxmldata -v
SYSTEM Info:
OSVER: 5.1.2600 2.0
OSLANGUAGE: 2052
OSNAME: Microsoft Windows XP Home Edition
kd> !findxmldata -d MIDI
Node DEVICE
DESCRIPTION : MPU-401 Compatible MIDI Device
HARDWAREID : ACPI\PNPB006
SERVICE : ms_mpu401
DRIVER : msmpu401.sys
kd> !findxmldata -r msmpu
Node DRIVER
FILENAME : msmpu401.sys
FILESIZE : 2944
CREATIONDATE : 05-06-2005 09:18:34
VERSION : 5.1.2600.0
MANUFACTURER : Microsoft Corporation
PRODUCTNAME : Microsoft« Windows« Operating System
Node DEVICE
DESCRIPTION : MPU-401 Compatible MIDI Device
HARDWAREID : ACPI\PNPB006
SERVICE : ms_mpu401
DRIVER : msmpu401.sys
kd> !findxmldata -h PCI\VEN_8086&DEV_24C3&SUBSYS_24C28086
Node DEVICE
DESCRIPTION : Intel(R) 82801DB/DBM SMBus Controller - 24C3
HARDWAREID : PCI\VEN_8086&DEV_24C3&SUBSYS_24C28086&REV_01
kd> !findxmldata -h USB\ROOT_HUB&VID8086&PID24C4&REV0001
Node DEVICE
DESCRIPTION : USB Root Hub
HARDWAREID : USB\ROOT_HUB&VID8086&PID24C4&REV0001
SERVICE : usbhub
DRIVER : usbhub.sys
kd> !findxmldata -h ACPI\PNPB006
Node DEVICE
DESCRIPTION : MPU-401 Compatible MIDI Device
HARDWAREID : ACPI\PNPB006
SERVICE : ms_mpu401
DRIVER : msmpu401.sys
附加信息
关于如何将dump文件放入CAB文件的更多信息,查看.dumpcab (Create Dump File CAB)。关于如何调试内核模式dump文件,包括保存在CAB文件中的dump,查看分析内核模式Dump文件。
!for_each_frame
!for_each_frame 对当前线程的调用堆栈的每一帧执行一次指定的调试器命令。
语法
!for_each_frame ["CommandString"]
!for_each_frame -?
参数
CommandString
指定每一帧要执行的调试器命令。如果CommandString 包含多条命令,必须用分号分隔它们,并且将整个CommandString 包含在引号中。如果有多条命令,则CommandString 中的每一条命令都不能使用引号。如果想在Command 中使用当前帧的序号,可以通过@$frame伪寄存器。
-?
在调试器命令窗口中显示该扩展命令的帮助。
DLL
Windows NT 4.0
|
Ext.dll
|
Windows 2000
|
Ext.dll
|
Windows XP和之后
|
Ext.dll
|
注释
如果没有指定任何参数,!for_each_frame 扩展列出所有的帧和它们的帧序号。关于帧列表的更详细信息,可以使用k (Display Stack Backtrace) 命令。
k 命令最多处理256帧。对枚举出来的每一帧,这一帧都会暂时变成当前的局部上下文(和.frame (Set Local Context) 命令类似)。当上下文设置之后,会执行 CommandString 。所有帧都被使用过之后,局部上下文会重置为使用!for_each_frame 之前的值。
如果包含CommandString,调试器会在为每一帧执行命令之前显示帧和帧序号。
下面的命令显示当前堆栈中的所有局部变量。
!for_each_frame !for_each_local dt @#Local
附加信息
关于局部上下文的更多信息,查看改变上下文。
!for_each_local
!for_each_local 对当前帧中的每一个局部变量执行调试器命令。
语法
!for_each_local ["CommandString"]
!for_each_local -?
参数
CommandString
指定要为当前堆栈帧中的每个局部变量执行的调试器命令。如果CommandString包含多条命令,必须用分号分隔它们,并且将整个CommandString 包含在引号中。如果有多条命令,则CommandString 中的每一条命令都不能使用引号。
在CommandString中或者CommandString中的命令执行的脚本中,都可以使用@#Local 别名。该别名会被局部变量的名字替换。这种替换在CommandString 执行之前并且进行任何其它的分析之前进行。该别名区分大小写,并且必须在前后都添加空格,即使它被包含在小括号中。如果使用C++ 表达式语法,必须用@@( @#Local )的形式来使用该别名。
该别名仅在!for_each_local 的生命周期中可用。不要将它和位寄存器、预定义别名或自定义别名混淆。
-?
在调试器命令窗口中显示该扩展命令的帮助。
DLL
Windows NT 4.0
|
Ext.dll
|
Windows 2000
|
Ext.dll
|
Windows XP和之后
|
Ext.dll
|
注释
如果没有指定任何参数,!for_each_local 列出所有局部变量。可以使用dv (Display Local Variables)命令查看局部变量的更多信息。
如果打开了调试器的详细输出,显示中会包括该扩展被调用时的局部变量总数,并且每次为局部变量执行CommandString时使用的CommandString 文本也会显示出来。
附加信息
关于如何显示和修改局部变量的更多信息,以及其他内存相关命令的说明,查看读写内存。
!for_each_module
!for_each_module 扩展对每个已加载模块执行指定的调试器命令一次。
语法
!for_each_module ["CommandString"]
!for_each_module -?
参数
CommandString
指定要为调试器的模块列表中每个模块执行一次的调试器命令。如果CommandString包含多条命令,必须用分号分隔它们,并且将整个CommandString 包含在引号中。如果有多条命令,则CommandString 中的每一条命令都不能使用引号。
在CommandString 和CommandString 的命令执行的任何脚本中,都可以使用以下这些别名。
别名
|
数据类型
|
值
|
@#ModuleIndex
|
ULONG
|
模块号。模块是从0开始连续的枚举的。
|
@#ModuleName
|
string
|
模块名。这个名字一般是不带扩展名的文件名。某些情况下,模块名和文件名会有显著不同。更多信息,查看可执行映像路径。
|
@#ImageName
|
string
|
可执行文件的名字,包含扩展名。一般来说,用户模式下会包含全路径,而内核模式不会。
|
@#LoadedImageName
|
string
|
如果不存在Microsoft CodeView符号,该别名和映像名一样。如果 在Microsoft Windows NT 4.0上存在CodeView符号,该别名是.dbg 文件的全路径。
|
@#MappedImageName
|
string
|
大多数情况下该别名为NULL。如果调试器映射了映像文件(例如调试minidump时),该别名是被映射的映像名。
|
@#SymbolFileName
|
string
|
符号文件的路径和名字。如果没有加载任何符号,该别名是可执行文件的名字。
|
@#ModuleNameSize
|
ULONG
|
模块名字符串的长度加1。
|
@#ImageNameSize
|
ULONG
|
映像名字符串的长度加1。
|
@#LoadedImageNameSize
|
ULONG
|
已加载映像名的字符串长度加1。
|
@#MappedImageNameSize
|
ULONG
|
已映射的映像名的字符串长度加1。
|
@#SymbolFileNameSize
|
ULONG
|
符号文件名字符串长度加1。
|
@#Base
|
ULONG64
|
映像开始位置的地址。
|
@#Size
|
ULONG
|
映像大小,以字节为单位。
|
@#End
|
ULONG64
|
映像的结束地址。
|
@#TimeDateStamp
|
ULONG
|
映像的时间和日期。如果要将该时间和日期展开为可读的形式,需要使用.formats (Show Number Formats)命令。
|
@#Checksum
|
ULONG
|
模块的校验和。
|
@#Flags
|
ULONG
|
模块的标志。DEBUG_MODULE_Xxx 值的列表,参见Dbgeng.h。
|
@#SymbolType
|
USHORT
|
符号类型。DEBUG_SYMTYPE_Xxx 的值的列表,参见Dbgeng.h。
|
这些别名都在每个模块执行CommandString 之前以及进行任何其他的分析之前被替换。它们是区分大小写的。别名前后都必须加上空格,即使使用括号括起来。如果使用C++表达式语法,必须以@@( @#alias )的形式来使用。
这些别名仅在!for_each_module 的生命周期中可用。不要将它们和伪寄存器、预定义别名或自定义别名混淆。
-?
在调试器命令窗口中显示该扩展命令的帮助。
DLL
Windows NT 4.0
|
Ext.dll
|
Windows 2000
|
Ext.dll
|
Windows XP和之后
|
Ext.dll
|
注释
如果未指定任何参数,!for_each_module显示所有已加载模块的信息。该信息和使用下面命令的输出类似。
!for_each_module .echo @#ModuleIndex : @#Base @#End @#ModuleName @#ImageName @#LoadedImageName
查看已加载和已卸载模块的更多信息,可以使用lm (List Loaded Modules)命令。
如果启用了详细的调试器输出,则调用该扩展命令时还会显示已加载和已卸载模块的总数,并且针对每个模块的CommandString命令执行前会显示详细信息(包括每个可用的别名的值) 。
下面是如何使用!for_each_module的例子。这个命令显示全局调试标志。
!for_each_module x ${@#ModuleName}!*Debug*Flag*
!for_each_module x ${@#ModuleName}!g*Debug*
下面的命令使用!chkimg检查每个模块是否被修改过了:
!for_each_module !chkimg @#ModuleName
下面的命令再每个已加载模块中搜索"MZ"。
!for_each_module s-a @#Base @#End "MZ"
附加信息
关于如何定义和使用别名来作为输入字符串的快捷方式 (包括 ${ } 标记的使用)的更多信息,查看使用别名。
!gflag
!gflag 扩展设置或显示全局标志。
语法
!gflag [+|-] Value
!gflag {+|-} Abbreviation
!gflag -?
!gflag
参数
Value
指定一个32位的16进制值。如果不使用加号(+)或者减号(-),则将全局标志的对应位设置为新值。如果在数字前使用了加号(+),会将全局标志的一个或多个位设置为1。如果数字前使用减号(-),则将一个或多个位设置为0。
Abbreviation
指定单个全局标志。Abbreviation 是要设置为1(+)或者0 (-)的全局标志的三字母缩写。
-?
在调试器命令窗口中显示该扩展命令的帮助文本,包括全局标志的缩写列表。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll Ntsdexts.dll
|
Windows XP和之后
|
Exts.dll
|
注释
如果没有指定任何参数,!gflag 显示当前的全局标志设置。
下面是Abbreviation 参数可用的缩写的表格。
值
|
名字
|
说明
|
0x00000001
|
"soe"
|
异常时停止。
|
0x00000002
|
"sls"
|
显示加载器快照(loader snaps)。
|
0x00000004
|
"dic"
|
调试初始命令。
|
0x00000008
|
"shg"
|
如果GUI停止响应(即挂起)则停止。
|
0x00000010
|
"htc"
|
启用堆尾部检查。
|
0x00000020
|
"hfc"
|
启用堆释放检查。
|
0x00000040
|
"hpc"
|
启用堆参数检查。
|
0x00000080
|
"hvc"
|
调用时进行堆的确认。
|
0x00000100
|
"ptc"
|
启用内存池尾部(pool tail)检查。
|
0x00000200
|
"pfc"
|
启用内存池释放检查.
|
0x00000400
|
"ptg"
|
启用内存池标记(tagging)。
|
0x00000800
|
"htg"
|
启用堆标记。
|
0x00001000
|
"ust"
|
创建一个用户模式堆栈回溯DB。
|
0x00002000
|
"kst"
|
创建一个内核模式堆栈回溯DB。
|
0x00004000
|
"otl"
|
维护一个每种类型的对象列表。
|
0x00008000
|
"htd"
|
通过DLL启用堆标记。
|
0x00010000
|
"idp"
|
未使用。
|
0x00020000
|
"d32"
|
启用对Microsoft Win32子系统的调试。
|
0x00040000
|
"ksl"
|
启用对内核调试器符号的加载。
|
0x00080000
|
"dps"
|
禁止对内核堆栈分页。
|
0x00100000
|
"scb"
|
启用紧急系统中断(critical system breaks)。
|
0x00200000
|
"dhc"
|
禁止在堆释放时进行合并。
|
0x00400000
|
"ece"
|
启用关闭异常(close exception)。
|
0x00800000
|
"eel"
|
启用异常日志。
|
0x01000000
|
"eot"
|
启用对象句柄类型标记(object handle type tagging)。
|
0x02000000
|
"hpa"
|
将堆分配放到页面末尾(Put heap allocations at the end of pages)。
|
0x04000000
|
"dwl"
|
调试INLOGON。
|
0x08000000
|
"ddp"
|
禁止内核模式的DbgPrint 和KdPrint 输出。
|
0x10000000
|
NULL
|
未使用。
|
0x20000000
|
NULL
|
未使用。
|
0x40000000
|
NULL
|
未使用。
|
0x80000000
|
"dpd"
|
禁止保护DLL验证(protected DLL verification)。
|
附加信息
也可以使用全局标志实用程序(Gflags.exe)来设置这些标志。
!gle
!gle 扩展显示当前线程的最后一个错误码。
语法
!gle [-all]
参数
-all
显示目标系统中每个用户模式线程的最终错误。如果在用户模式下省略该参数,调试器显示当前线程的最终错误。如果内核模式下省略该参数,调试器显示当前的寄存器上下文指定的线程的最终错误。
DLL
Windows NT 4.0
|
Ext.dll Ntsdexts.dll
|
Windows 2000
|
Ext.dll Ntsdexts.dll
|
Windows XP和之后
|
Ext.dll
|
注释
!gle扩展显示GetLastError的值并尝试解码它。
内核模式下,!gle 扩展只有在调试器能够读取线程环境块(TEB)时才能工作。
附加信息
关于GetLastError 函数的更多信息,查看Micorosft Windows SDK 文档。
!gs
!gs 扩展用于分析/GS 堆栈溢出。
语法
!gs
DLL
Windows NT 4.0
|
Ext.dll
|
Windows 2000
|
Ext.dll
|
Windows XP和之后
|
Ext.dll
|
注释
!gs 扩展用于协助调试缓冲区溢出。当遇到STATUS_STACK_BUFFER_OVERRUN错误时使用!gs ,如下。
0:000> !gs
Corruption occurred in mshtml!CDoc::OnPaint or one of its callers
Real canary not found at 0x74866010
Canary at gsfailure frame 0x292ea4e7
Corrupted canary 0x0013e2c8: 0x00000000
Corrupted cookie value too generic, skipping init bit-flip check
a caller of mshtml!CDoc::OnPaint has corrupted the EBP from 0x0013e254 to 0x0013
e234
check callers (without canary) of mshtml!CDoc::OnPaint for 0x1 bytes of overflow
The canary doesn't look corrupted. Not sure how we got here
EBP/ESP check skipped: No saved EBP in exception context
Function mshtml!CDoc::OnPaint:
00000000 - 00000004 this CDoc*
0013de40 - 0013e180 rd CDoc::OnPaint::__l39::REGION_DAT
A
0013e180 - 0013e18c Lock CDoc::CLock
0013e18c - 0013e224 DI CFormDrawInfo
0013e23c - 0013e240 hwndInplace HWND__*
0013e240 - 0013e244 prc tagRECT*
0013e248 - 0013e250 ptBefore tagPOINT
0013e250 - 0013e254 fViewIsReady int
0013e250 - 0013e254 fHtPalette int
0013e254 - 0013e258 fNoPaint int
0013e258 - 0013e260 ptAfter tagPOINT
0013e260 - 0013e264 c int
0013e264 - 0013e268 hrgn HRGN__*
0013e268 - 0013e2a8 ps tagPAINTSTRUCT
Candidate buffer : ps 0013e268 to 0013e2a7
0013e268 ea 04 01 a7 00 00 00 00-10 01 00 00 f3 00 00 00 ................
0013e278 ed 03 00 00 44 02 00 00-84 e5 13 00 f4 e2 13 00 ....D...........
...
0013e2ac 38 20 01 03 10 e3 13 00-68 6b e6 01 d0 e6 03 00 8 ......hk......
0013e2bc 80 fa 03 00 0d 00 00 00-10 08 19 00 00 00 00 00 ................
0:000>