cc682/NetRoc
http://netroc682.spaces.live.com/
调试器扩展命令
本节描述可以在CDB、KD和WinDbg中使用的各种调试器扩展命令。
每条扩展命令(或者简称为扩展)都有自己的参考主题。以粗体显示的项需要逐字输入,以斜体显示的项表示是在Parameters 节中会进行说明的参数。中括号([ xxx ]) 中的参数是可选的,中括号中的竖线([ xxx | yyy ])表示可以使用其中的一个或者不使用。大括号和竖线({ xxx | yyy })表示必须包含括起来的参数中的一个。
一般来说,扩展命令不支持由调试器命令和元命令支持的完整表达式语法。关于每条命令的语法要求,分别查看它们的参考主题。
本节描述了以下几种类型的扩展命令:
常规扩展
内核模式扩展
用户模式扩展
专用扩展
常规扩展
本节描述在用户模式和内核模式调试中都常常会用到的扩展命令。
调试器会自动加载适当版本的扩展命令。如果不是自己加载不同的版本,则不需要关心使用到哪个DLL。关于默认的模块搜索顺序的更多信息,查看使用调试器扩展命令。关于如何加载扩展模块的更多信息,查看加载调试器扩展DLL。
每个扩展命令的参考主题都会列出暴露该命令的DLL。使用下面的规则来判断扩展DLL从哪个目录加载:
- 如果目标机运行Microsoft Windows XP和之后版本的Windows,使用的是winxp\kdexts.dll、winxp\ntsdexts.dll、 winxp\exts.dll、winext\ext.dll或 dbghelp.dll。
- 如果目标机运行发行版的Windows 2000,则使用w2kfre\kdextx86.dll、 w2kfre\ntsdexts.dll、 winext\ext.dll或 dbghelp.dll。
- 如果目标机运行调试版的Windows 2000,则使用w2kchk\kdextx86.dll、 w2kchk\ntsdexts.dll、winext\ext.dll或dbghelp.dll。
- 如果目标机运行Windows NT 4.0发行版,使用的是nt4fre\kdextx86.dll、 nt4fre\ntsdexts.dll、 winext\ext.dll或者 dbghelp.dll。
- 如果目标机运行调试版Windows NT 4.0,使用的是nt4chk\kdextx86.dll、nt4chk\ntsdexts.dll、 winext\ext.dll或 dbghelp.dll。
!acl
!acl 扩展命令格式化并显示某个访问控制列表(access control list (ACL))的内容。
语法
Microsoft Windows XP和之后版本的语法
!acl Address [Flags]
Windows NT 4.0和Windows 2000的语法
!acl Address
参数
Address
指定ACL的16进制地址。
Flags
(Windows XP 和之后版本) 如果Flags的值为1,显示ACL的友好名称。友好名中包含安全标识符(SID)以及SID的域和用户名。
DLL
|
Windows NT 4.0
|
Kdextx86.dll
|
|
Windows 2000
|
Kdextx86.dll
|
|
Windows XP 和之后
|
Exts.dll
|
注释
下面是一个!acl 扩展的示例。
kd> !acl e1bf35d4 1
ACL is:
ACL is: ->AclRevision: 0x2
ACL is: ->Sbz1 : 0x0
ACL is: ->AclSize : 0x40
ACL is: ->AceCount : 0x2
ACL is: ->Sbz2 : 0x0
ACL is: ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
ACL is: ->Ace[0]: ->AceFlags: 0x0
ACL is: ->Ace[0]: ->AceSize: 0x24
ACL is: ->Ace[0]: ->Mask : 0x10000000
ACL is: ->Ace[0]: ->SID: S-1-5-21-518066528-515770016-299552555-2981724 (User: MYDOMAIN\myuser)
ACL is: ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
ACL is: ->Ace[1]: ->AceFlags: 0x0
ACL is: ->Ace[1]: ->AceSize: 0x14
ACL is: ->Ace[1]: ->Mask : 0x10000000
ACL is: ->Ace[1]: ->SID: S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)
附加信息
关于访问控制列表的更多信息,查看!sid、 !sd、以及获得对象的ACL。 另外,可以查看Microsoft Windows SDK 文档、Windows Driver Kit (WDK) 文档、以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!address
!address 扩展显示目标进程或目标机使用的内存信息。
语法
用户模式
!address Address
!address -summary
!address -Filter
!address -?
内核模式
!address Address
!address
参数
Address
只显示地址空间中包含Address的区域。
-summary
仅显示摘要信息。
Filter
只显示指定的区域。Filter 的值不区分大小写。
下面这些可能的Filter 值按照目标进程使用内存的方式来指定内存区域。
|
Filter 值
|
显示的内存区域
|
|
RegionUsageIsVAD
|
"busy" 区域。包括所有 虚拟分配块、SBH堆、自定义内存分配器(custom allocators)的内存、以及地址空间中所有属于其他分类的内存块。
|
|
RegionUsageFree
|
目标的虚拟地址空间中所有可用内存。包括所有非提交(committed)和非保留(reserved)的内存。
|
|
RegionUsageImage
|
用来映射二进制映像的内存区域。
|
|
RegionUsageStack
|
用作目标进程的线程的堆栈的内存区域。
|
|
RegionUsageTeb
|
用作目标进程中所有线程的线程环境块(TEB)的内存区域。
|
|
RegionUsageHeap
|
用作目标进程的堆的内存区域。
|
|
RegionUsagePageHeap
|
用作目标进程的整页堆(full-page heap)的内存区域。
|
|
RegionUsagePeb
|
目标进程的进程环境块(PEB)的内存区域。
|
|
RegionUsageProcessParametrs
|
用作目标进程启动参数的内存区域。
|
|
RegionUsageEnvironmentBlock
|
用作目标进程的环境块的内存区域。
|
下面这些Filter值按照内存类型来指定内存。
|
Filter 值
|
显示的内存类型
|
|
MEM_IMAGE
|
映射的文件属于可执行映像一部分的内存。
|
|
MEM_MAPPED
|
映射的文件不属于可执行映像一部分的内存。这种内存包含哪些从页面文件映射的内存。
|
|
MEM_PRIVATE
|
私有的(即不和其他进程共享)并且未用来映射任何文件的内存。
|
下面的Filter 值按照状态来指定内存:
|
Filter 值
|
显示的内存状态
|
|
MEM_COMMIT
|
当前已提交给目标使用的所有内存。已经在物理内存或者页面文件中为这些内存分配了物理的存储空间。
|
|
MEM_RESERVE
|
所有为目标以后的使用保留的内存。这种内存还没有分配物理上的存储空间。
|
|
MEM_FREE
|
目标虚拟地址空间中所有可用内存。包括所有未提交并且未保留的内存。该Filter 值和RegionUsageFree一样。
|
-?
在调试器命令窗口中显示该命令的简短帮助。
DLL
|
Windows NT 4.0
|
不可用
|
|
Windows 2000
|
Ext.dll
|
|
Windows XP 和之后
|
Ext.dll
|
注释
不带任何参数时,!address 扩展命令显示整个地址空间和使用摘要的信息。!address -summary 命令仅显示摘要信息。
内核模式下,该命令仅搜索内核内存,即使使用了.process (Set Process Context) 来指定某个进程的虚拟地址空间。用户模式下,!address 扩展总是引用目标进程拥有的内存。
用户模式下,!address Address 显示包含指定地址的区域的特征。不带参数时,!address 显示所有内存区域的特征。包括内存类型、内存状态和内存的使用方式。关于这些信息的含义,查看前面对Filter 进行说明的表格。
下面是!address的例子。
0:000> !address 7c571234
7c570000 : 7c571000 - 00059000
Type 01000000 MEM_IMAGE
Protect 00000020 PAGE_EXECUTE_READ
State 00001000 MEM_COMMIT
Usage RegionUsageImage
FullPath C:\WINNT\system32\KERNEL32.dll
该例子使用的Address 值为0x7C571234。输出表明这是以地址0x7C570000开头的一个大的内存区域。 该区域中包含一个以0x7C571000 开头,大小为0x59000的小一些的区域。因此,这个小区域是从0x7C571000 到0x7C5C9FFF。它的内存类型为MEM_IMAGE、状态为 MEM_COMMIT、使用方式为RegionUsageImage。 (这些值的含义,查看前面的表格。) 此外,该内存是可读可执行,但是不可写的。最后,该内存是在属于Kernel32.dll 模块的空间中的。
一般要查看某个地址的信息,使用方式的信息常常是最重要的。知道使用方式后,可以用其他的扩展命令来查看更多信息。例如,如果使用方式是 RegionUsageHeap,可以用!heap 扩展命令来查看更多。
内核模式下!address的输出类似,但是包含的信息要少一些。下面是这种情况的例子。
kd> !address
804de000 - 00235000
Usage KernelSpaceUsageImage
ImageName ntoskrnl.exe
80c00000 - 001e1000
Usage KernelSpaceUsagePFNDatabase
....
f85b0000 - 00004000
Usage KernelSpaceUsageKernelStack
KernelStack 817b4da0 : 324.368
f880d000 - 073d3000
Usage KernelSpaceUsageNonPagedPoolExpansion
"usage"的含义和用户模式下一样。"ImageName"表示该地址关联的模块、"KernelStack"中会显示线程的ETHREAD块的地址(0x817B4DA0)、 进程ID (0x324)、以及线程ID(0x368)。
附加信息
关于如何显示和搜索内存的更多信息,查看读写内存。显示内存属性的其他扩展命令,查看!vm (内核模式) 和!vprot (用户模式)。
!analyze
!analyze 扩展显示当前异常或bug check的信息。
语法
用户模式
!analyze [-v] [-f | -hang] [-D BucketID]
!analyze -c [ -load KnownIssuesFile | -unload | -help ]
内核模式
!analyze [-v] [-f | -hang] [-D BucketID]
!analyze -c [ -load KnownIssuesFile | -unload | -help ]
!analyze -show BugCheckCode [BugParameters]
参数
-v
显示详细输出。
-f
生成!analyze 的异常输出。即使调试器未检测到异常时也可以使用该参数来查看异常分析。
-hang
生成!analyze 的挂起程序输出。也可以在目标经历了bug check或者异常之后使用该参数,但是用于进行挂起状态分析会和问题相关性更高。内核模式下,!analyze -hang 会调查系统持有的锁并且扫描DPC队列。用户模式下,!analyze -hang 对线程堆栈进行分析,以查看是否某些线程阻塞了其他线程。
在用户模式下运行该扩展之前,要考虑将当前线程变为被认为停止响应(即,挂起)的那个线程,因为异常可能造成当前线程改变。
-D BucketID
仅显示和指定的BucketID 相关的项。
-show
显示指定的bug check代码的信息。
-c
当调试器遇到已知问题时,继续执行。如果该问题不是"已知"的,则调试器仍然保持中断目标的状态。
-c选项可以和下面的子参数一起使用。这些子参数可以配置已知问题的列表。它们本身不会造成执行。至少执行!analyze -c -load 一次, !analyze -c 才会起作用。
-load KnownIssuesFile
加载指定的已知问题文件。KnownIssuesFile 指定该文件的路径和名字。这个文件必须是XML格式的。可以在调试器安装目录的sdk\samples\analyze_continue 子目录中找到示例文件。 (必须完整安装Windows调试工具包才能包含该文件。完整安装的更多信息,查看安装调试器。)
KnownIssuesFile 文件中的已知问题列表将会用于之后的所有!analyze -c 命令,直到使用!analyze -c –unload,或者再次使用 !analyze -c -load (这时,新数据会覆盖掉旧的数据)。
-unload
卸载当前的已知问题列表。
-help
在调试器命令窗口中显示!analyze –c扩展命令的帮助文本。
BugCheckCode
指定要显示的bug check代码。
BugParameters
指定最多4个bug check参数。以空格分隔这些参数。这些参数使得以后的搜索更加精练。
DLL
|
Windows NT 4.0
|
Ext.dll
|
|
Windows 2000
|
Ext.dll
|
|
Windows XP 和之后
|
Ext.dll
|
注释
用户模式下,!analyze 和!analyze -v 扩展显示当前异常的信息。
内核模式下,它们显示最近的bug check的信息。如果发生了bug check,会自动产生!analyze 的显示。可以使用!analyze -v 来显示更多信息。如果只需要查看基本的bug check 参数,可以使用.bugcheck (Display Bug Check Data)命令。
可以使用!analyzebugcheck -show 扩展命令来单独显示bug check 代码的信息。这些信息不受目标机当前状态的影响。
这是一个断点中断时的!analyze 结果示例。
0:000> !analyze
Last event: Hit breakpoint 10000
附加信息
用户模式异常和内核模式停机错误(即崩溃)的示例分析、以及!analyze 如何使用triage.ini 文件的更多信息,查看使用!analyze 扩展。
!asd
!asd 扩展用来显示从指定地址开始的数据缓存中的指定个数的错误分析条目。
语法
!asd Address DataUsed
参数
Address
指定要显示的第一个错误分析条目的地址。
DataUsed
指定要显示的标记(token)个数。
DLL
|
Windows NT 4.0
|
Ext.dll
|
|
Windows 2000
|
Ext.dll
|
|
Windows XP 和之后
|
Ext.dll
|
注释
!asd 扩展仅在调试!analyze 扩展时有用。
可以用!dumpfa 来调试!analyze扩展。
!atom
!atom 扩展显示指定的atom或者当前进程的所有atom的原子表(atom table)。
语法
!atom [Address]
参数
Address
指定要显示的atom的16进制虚拟地址。如果省略该参数或者为0,则显示当前进程的atom table。该列表中包含进程的所有atom。
DLL
|
Windows NT 4.0
|
Kdextx86.dll Ntsdexts.dll
|
|
Windows 2000
|
Kdextx86.dll Ntsdexts.dll
|
|
Windows XP 和之后
|
Ext.dll
|
附加信息
关于atom和atom table的更多信息,查看Microsoft Windows SDK 文档。
!bitcount
!bitcount 扩展统计内存范围中为"1"的位的个数。
语法
!bitcount StartAddress TotalBits
参数
StartAddress
指定要统计为"1"的位个数的开始地址。
TotalBits
指定内存范围的大小,以位为单位。
-?
在调试器命令窗口中显示该命令的帮助文本。
DLL
|
Windows NT 4.0
|
不可用
|
|
Windows 2000
|
不可用
|
|
Windows XP 和之后
|
Exts.dll
|