由于blog的形式查阅帮助文档不便,所以还是转移到了专门的空间中,做成了在线Help的形式。目前翻译的文档由于需要修复链接,以及更新新版WinDbg文档中的内容,所以还在陆续整理中。
另外还挂了一个论坛和另一个blog上去,刚刚开始做,所以各方面都还很不完善,正在努力中:)
http://www.dbgtech.net/
摘要: cc682/NetRoc
http://netroc682.spaces.live.com/
!evlog
!evlog 扩展命令用于显示、修改或者备份事件日志(event log)。
语法
!evlog addsource [-d] [-s Source] [-t Type] [-f MsgFil...
阅读全文
cc682/NetRoc
http://netroc682.spaces.live.com/
用户模式扩展命令
本小节中的参考用于描述主要在用户模式调试时使用的扩展命令。
调试器会自动加载这些扩展命令的适当版本。如果不是自己已经加载了一个不同的版本,那么就不需要关心所使用的DLL版本。查看使用调试器扩展命令获得默认模块搜索顺序的说明。查看加载调试器扩展DLL获得关于加载扩展模块的说明。
每个扩展命令的参考部分都列出了导出该命令的DLL。可以用下面的规则来判断扩展DLL是从什么地方加载的:
- 目标程序运行在Windows NT 4.0发行版上,使用的是nt4fre\Ntsdexts.dll。
- 目标程序运行在Windows NT 4.0 checked版上,使用nt4chk\Ntsdexts.dll。
- 目标程序运行在Windows 2000 发行版商,使用w2kfre\Ntsdexts.dll。
- 目标程序运行于Windows 2000 checked版本上,使用w2kchk\Ntsdexts.dll。
- 目标程序运行于Windows XP和之后版本中时,使用 winxp\Ntsdexts.dll。
另外,和操作系统不相关的那些用户模式扩展放在winext\Uext.dll中。
!avrf
!avrf扩展用于控制Application Verifier的设置,并且显示由Application Verifier产生的各种输出。
语法
!avrf
!avrf -a Address
!avrf -cs { Length | -a Address }
!avrf -hp { Length | -a Address }
!avrf -vs { Length | -a Address }
!avrf -dlls [ Length ]
!avrf -ex [ Length ]
!avrf -cnt
!avrf -trm
!avrf -threads [ThreadID]
!avrf -trace TraceIndex
!avrf -brk [BreakEventType]
!avrf -flt
!avrf -flt EventType Probability
!avrf -flt break EventType
!avrf -flt stacks Length
!avrf -trg [ Start End | dll Module | all ]
!avrf -skp [ Start End | dll Module | all | Time ]
参数
-a Address
指定一个地址。会显示包含这个地址的内存分配记录、以这个地址为开始的内存释放操作记录。如果该选项前面没有 –cs、 -hp或者 –vs,那么会搜索light heap。
-cs
显示临界区(critical section)的删除日志。详细信息查看Application Verifier 文档中的"Critical Section Delete Logs"。
-hp
显示堆操作日志。详细信息查看Application Verifier 文档中的"Heap Operation Logs"。
-vs
显示虚拟地址空间(virtual space)操作日志。详细信息,查看Application Verifier 文档中的"Virtual Space Operation Logs"。
-dlls
显示DLL的加载/卸载日志。详细信息查看Application Verifier 文档中的"DLL Load/Unload Logs"。
-ex
显示异常日志。详细信息查看Application Verifier 文档中的"Exception Logs"。
Length
指定要显示的记录数量。如果使用了-dlls 或者-ex 选项,则可以省略Length来显示所有的DLL 加载/卸载操作或者所有异常记录。
-cnt
显示全局计数器(global counter)的清单。
-trm
显示所有终止和挂起线程的日志。
-threads
显示目标进程中线程的信息。对于子线程,还会显示堆栈大小和由父线程指定的CreateThread 标志。
ThreadID
指定要显示的线程ID。省略时显示所有线程。
-trace TraceIndex
显示指定的TraceIndex 的调用堆栈。一些结构用到了这个16位索引来标识调用堆栈。这个索引指向调用堆栈数据库(stack trace database)中的位置。如果正在分析这样的结构,那么这个选项非常有用。
-brk
表明这是一个break-event命令。不带参数适用 !avrf -brk 时,会显示break event设置。可以在 文档的 "Requesting Breaks on Certain Events" 中查看示例。
BreakEventType
指定break event 的type number 。查看Application Verifier 文档的"Requesting Breaks on Certain Events"获得可用type的列表。
-flt
表示这是一个fault-injection 命令。不带参数使用!avrf –flt时,显示当前的fault injection 设置。查看Application Verifier 文档中的"Choosing Which Events to Fault"获得示例。
EventType
指定event的type number。查看Application Verifier 文档中的"Choosing Which Events to Fault"获得可能的type的列表。
Probability
指定该event将会失败的频率。可以是从0到100(0x64)之间的任意整数。
break
让每次该fault 被inject时,Application Verifier 都中断到调试器中。这种中断的示例,查看Application Verifier 文档中的"Choosing Which Events to Fault"。
stacks
显示最近一次fault-injected 操作的调用堆栈。查看Application Verifier 文档的"Choosing Which Events to Fault"获得示例。
-trg
表明这是一个target range 命令。 不带参属使用 –trg时,显示当前的target range。详细信息查看Application Verifier 文档中的"Choosing Where to Fault"。
-skp
表示这是一个exclusion range 命令。不带参数使用-trg时,显示当前的target range。详细信息查看Application Verifier 文档中的"Choosing Where to Fault"。
Start
指定target range 或者exclusion range 的开始地址。
End
指定target range 或者exclusion range 的结束地址。
Module
指定要targeted 或者excluded 的模块名。Module是完整的模块名,包括.exe 或.dll 扩展名。不能含有路径信息。
all
使得所有的target range或者exclusion range重置。
Time
恢复执行后的Time毫秒内消除任何fault。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Exts.dll
|
注释
不带参数使用!avrf 扩展时,会显示当前的Application Verifier选项。如果已经启用了Full page heap 或者Fast fill heap选项,那么还会显示active page heap的信息。查看Application Verifier 文档中的 "Heap Operation Logs"获得示例。
如果发生了Application Verifier Stop,不带参数的!avrf 扩展会显示停止的类型以及原因。查看Application Verifier 文档中的"Debugging Application Verifier Stops" 获得示例。
如果没有ntdll.dll 和verifier.dll 的符号,那么!avrf 扩展会产生错误信息。关于如何定位这种问题的信息,查看Application Verifier 文档中的"Setting Up a Debugger for Application Verifier"。
附加信息
关于如何下载和安装Application Verifier ,以及它的文档的信息,查看Application Verifier。
!critsec
!critsec 扩展命令显示某个临界区(critical section)。
语法
!critsec Address
参数
Address
指定临界区的16进制地址。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
Ntsdexts.dll
|
注释
如果不知道该临界区的地址,可以使用!ntsdexts.locks 扩展。它会显示由调用RtlInitializeCriticalSection 来初始化的所有临界区。
下面是示例:
0:000> !critsec 3a8c0e9c
CritSec +3a8c0e9c at 3A8C0E9C
LockCount 1
RecursionCount 1
OwningThread 99
EntryCount 472
ContentionCount 1
*** Locked
附加信息
关于其他可以显示临界区信息的命令,查看显示临界区。关于临界区的信息,查看Microsoft Windows SDK文档、Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!dp (!ntsdexts.dp)
Ntsdexts.dll中的!dp 扩展命令显示一个CSR进程。
不要将该命令和dp (Display Memory) 命令或者 !kdext*.dp扩展命令混淆。
语法
!dp [v] [ PID | CSR-Process ]
参数
v
详细模式。显示中包含结构和线程列表。
PID
指定CSR进程的进程ID。
CSR-Process
指定CSR进程的16进制地址。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
Ntsdexts.dll
|
注释
该命令会显示进程地址、进程ID、序号(sequence number)、标志(flags)和引用计数。如果选择了详细模式,还会显示更多细节以及每个进程的线程信息。
如果没有指定进程,则会显示所有进程。
参见
!dt
!dphdump
!dphdump 扩展命令显示debug page heap。
语法
!dphdump Address
参数
Address
指定堆的基地址或者堆句柄。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
不可用
|
Windows XP和之后
|
不可用
|
注释
如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。
参见
!dphfind, !dphflags, !dphhogs
!dphfind
!dphfind 扩展命令查找包含指定地址的debug page heap。
语法
!dphfind Address
参数
Address
指定debug page heap必须包含的16进制地址。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
不可用
|
Windows XP和之后
|
不可用
|
注释
Address一般是应用程序尝试访问从debug page heap中分配的内存时出错的地址。
如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。
参见
!dphdump, !dphflags, !dphhogs
!dphflags
!dphflags 扩展命令显示或设置global page heap flags。
语法
!dphflags [FLAGS]
参数
FLAGS
可以是下面这些位的任意组合:
Bit 0 (0x1)
使得调试器启用page heap。(99%的情况下都会希望设置这一位。如果为0,则使用标准堆。)
Bit 1 (0x2)
使得调试器搜集调用堆栈。(一般只在checked build上面才会设置。)
Bit 2 (0x4)
让调试器最小化对内存的影响。
Bit 3 (0x8)
指定最小化(minimization)方法。如果设置了这一位,最小化是随机进行的。如果为0,则基于大小范围(size range)进行最小化。(如果没有设置bit 2(0x4),则这个设置被忽略。)
Bit 4 (0x10)
让调试器捕获反向溢出(backward overrun)。
Bits 15 to 8
指定可用内存的百分比(相对于总内存),低于可以从标准堆中进行分配的大小。仅当设置了bit 2(0x4)时起效。
Bits 31 to 16
指定在page heap中分配的机率。只有当bit 2(0x4)和bit 3(0x8)设置时起效。需要指定两个大小:小一点的位于bit 31到bit 24,大一点的在bit 23到bit 16。大小处于这两个值之间的内存分配将从page heap中分配。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
不可用
|
Windows XP和之后
|
不可用
|
注释
如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。
这里有一些示例。下面的命令在free build上启用调用堆栈的搜集。(默认情况下不会):
!dphflags 0x03
下面的命令将不可访问的页面放到分配(allocation)的开始位置。并且启用调用堆栈的跟踪:
!dphflags 0x13
下面的命令使得有48%可能性从page heap中分配。同样,如果可用内存低于48%,则所有分配都会从标准堆中进行:
!dphflags 0x3000300F
参见
!dphdump, !dphfind, !dphhogs
!dphhogs
!dphhogs 扩展用于显示debug page heap hogs。
语法
!dphhogs Address [count] [reset]
参数
Address
指定堆的基地址或者堆句柄。
count
列表按照count来排序(而不是按字节)。
reset
所有的allocation counts重置为0。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
不可用
|
Windows XP和之后
|
不可用
|
注释
这个命令只能用于运行在x86处理器上的checked版本Windows NT 4.0。
如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。
参见
!dphdump, !dphfind, !dphflags
!dreg
!dreg 扩展命令显示注册表信息。
语法
!dreg [-d|-w] KeyPath[!Value]
!dreg
参数
-d
二进制数据显示为DWORD。
-w
二进制数据显示为WORD。
KeyPath
指定注册表路径。可以使用下面这些缩写:
hklm
HKEY_LOCAL_MACHINE
hkcu
HKEY_CURRENT_USER
hkcr
HKEY_CLASSES_ROOT
hku
HKEY_USERS
如果没有使用缩写,则假定使用HKEY_LOCAL_MACHINE。
Value
指定要显示的注册表值。星号(*)可以代表任何值。如果省略Value,则显示所有子键。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
Ntsdexts.dll
|
注释
!dreg 扩展用于在用户模式调试时显示注册表。
在远程调试时由于可以查看远程机器的注册表,所以非常有用。从内核调试器控制用户模式调试器时也很有用,因为目标机冻结的时候是不能运行标准的注册表编辑器的。(这时也可以使用.sleep 命令。查看从内核调试器控制用户模式调试器获得详细信息。)
由于信息是按照容易阅读的格式显示的,所以本地调试时也有用。
如果在内核模式调试时使用!dreg结果显示的是主控机上面的,而不是目标机上的。要显示目标机上的原始注册表信息,可以使用!reg扩展命令来替代。.
这里有一些示例。下面这个显示指定的注册表键下面所有子键:
!dreg hkcu\Software\Microsoft
下面显示指定的注册表键下面所有值:
!dreg System\CurrentControlSet\Services\Tcpip!*
这条命令显示指定的注册表键下面的Start键值:
!dreg System\CurrentControlSet\Services\Tcpip!Start
不带参数使用!dreg 会在调试器命令窗口中显示该命令的简单帮助。
附加信息
关于注册表的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!dt
!dt 扩展命令显示某个CSR线程的信息。
该命令不能和dt (Display Type)命令混淆。
语法
!dt [v] CSR-Thread
参数
v
详细输出。
CSR-Thread
指定CSR线程的16进制地址。
DLL
Windows NT 4.0
|
Ntsdexts.dll
|
Windows 2000
|
Ntsdexts.dll
|
Windows XP和之后
|
Ntsdexts.dll
|
注释
该扩展命令显示CSR线程关联的线程、进程、client ID、标志和引用计数。如果使用了详细模式,输出中还包含list pointer、线程句柄和等待块(wait block)。
参见
!dp (!ntsdexts.dp)
摘要: cc682/NetRoc
http://netroc682.spaces.live.com/
!vm
!vm扩展命令显示目标系统中虚拟内存使用统计的摘要信息。
语法
Windows NT 4.0的语法
!vm
Windows 2000和之后的语法
!vm [Flags]
参数
Flags
(Windows ...
阅读全文
摘要: cc682/NetRoc
http://netroc682.spaces.live.com/
!thread
!thread 扩展显示目标系统中线程包括ETHREAD块在内的摘要信息。该命令只能在内核模式调试下使用。
这个扩展命令和.thread (Set Register Context)命令不同。
语法
Windows NT 4.0 和Windows ...
阅读全文
摘要: cc682/NetRoc
http://netroc682.spaces.live.com/
!searchpte
!searchpte 在物理内存中搜索指定的页面帧序号(PFN)。
语法
!searchpte PFN !searchpte -?
参数
PFN
以16进制格式指定PFN。
-?
在调试器命令窗口中显示该...
阅读全文
cc682/NetRoc
http://netroc682.spaces.live.com/
!qlocks
!qlocks 扩展用于显示所有排队的自旋锁(queued spin lock)的状态。
语法
!qlocks
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
该命令仅在多处理器系统上有用。
下面是一个示例:
0: kd> !qlocks
Key: O = Owner, 1-n = Wait order, blank = not owned/waiting, C = Corrupt
Processor Number
Lock Name 0 1 2 3
KE - Dispatcher
KE - Unused Spare
MM - PFN
MM - System Space
CC - Vacb
CC - Master
EX - NonPagedPool
IO - Cancel
EX - WorkQueue
IO - Vpb
IO - Database
IO - Completion
NTFS - Struct
AFD - WorkQueue
CC - Bcb
MM - MM NonPagedPool
附加信息
关于自旋锁的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!ready
!ready 扩展命令显示系统中READY状态的所有线程的摘要信息。
语法
!ready [Flags]
参数
Flags
指定显示的级别。Flags 可以是下面这些位的任意组合。如果Flags 为0,则只显示很少的信息。默认值是0x6。
Bit 1 (0x2)
使得显示中包括线程的等待状态。
Bit 2 (0x4)
如果包含这个位,但是不包含Bit 1(0x2),则不会起作用。如果和Bit 1一起,则显示线程的调用堆栈。
Bit 3 (0x8)
(Windows XP和之后) 使得显示出来的每个函数包含返回地址、堆栈指针、以及bsp寄存器(Itanium系统)的值。不显示函数的参数。
Bit 4 (0x10)
(Windows XP和之后) 显示的每个函数只包括它的返回地址,不显示参数和堆栈指针。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
除了只显示就绪的线程之外,该命令的输出和!thread类似,并且输出按照优先权从高到低排序。
附加信息
关于线程调度和READY状态的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!reg
!reg 扩展命令用于显示和搜索注册表数据。
语法
!reg kcb Address
!reg knode Address
!reg kbody Address
!reg kvalue Address
!reg valuelist HiveAddress KeyNodeAddress
!reg subkeylist HiveAddress KeyNodeAddress
!reg cellindex HiveAddress Index
!reg baseblock HiveAddress
!reg seccache HiveAddress
!reg hashindex HashKey
!reg openkeys {HiveAddress|0}
!reg findkcb Path
!reg hivelist
!reg viewlist HiveAddress
!reg freebins HiveAddress
!reg freecells BinAddress
!reg dirtyvector HiveAddress
!reg freehints HiveAddress
!reg dumppool [s|r]
参数
kcb Address
显示某个registry key control block。Address 指定key control block的地址。
knode Address
显示一个registry key node structure。 Address 指定这个key node的地址。
kbody Address
显示一个registry key body (KBODY) 结构。Address 指定这个key body的地址。(Registry key body是和句柄关联的实际对象。)
kvalue Address
显示某个registry key value结构。Address 指定值的地址。
valuelist HiveAddress KeyNodeAddress
显示指定的key node中value的列表。HiveAddress 指定hive的地址。KeyNodeAddress 指定key node的地址。
subkeylist HiveAddress KeyNodeAddress
显示指定的key node的subkey列表。HiveAddress 指定hive的地址。KeyNodeAddress 指定key node的地址。
cellindex HiveAddress Index
显示hive中某个cell的虚拟地址。HiveAddress 指定hive的地址。Index指定cell的序号。
baseblock HiveAddress
显示某个hive的base block (也称为hive header)。HiveAddress指定hive的地址。
seccache HiveAddress
显示某个hive的security cache。HiveAddress指定hive的地址。
hashindex HashKey
计算某个hash key的hash index entry。HashKey用于指定这个key。
openkeys { HiveAddress | 0 }
显示某个hive中所有打开的key。HiveAddress 指定hive的地址。如果使用0,则显示整个registry hash table;该table包含注册表中所有已打开的key。
findkcb Path
显示某个注册表路径对应的registry key control block。Path 指定完整的key路径,这个路径必须在hash table中存在。
hivelist
显示系统中所有hive的列表,以及每个hive相关的详细信息。
viewlist HiveAddress
显示某个hive的所有pinned and mapped view,以及每个view的详细信息。HiveAddress 指定hive的地址。
freebins HiveAddress
显示某个hive的所有free bin,以及每个bin的详细信息。HiveAddress 用于指定hive的地址。
freecells BinAddress
遍历一个bin并且显示它里面所有的cell。BinAddress指定bin的地址。
dirtyvector HiveAddress
显示某个hive的dirty vector。HiveAddress指定hive的地址。
freehints HiveAddress
显示空闲的hint。HiveAddress指定hive的地址。
dumppool [ s | r ]
显示注册表分配的分页池(registry-allocated paged pool)。如果指定了s,则注册表页面列表(registry page list)会保存到一个临时文件中。如果指定r ,则从先前保存的临时文件恢复注册表页面列表。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
使用!dreg扩展命令来显示格式化后的注册表键信息。
下面是一些示例:
kd> !reg hivelist
-------------------------------------------------------------------------------------------------------------
| HiveAddr |Stable Length|Stable Map|Volatile Length|Volatile Map|MappedViews|PinnedViews|U(Cnt)| BaseBlock | FileName
-------------------------------------------------------------------------------------------------------------
| e16e7428 | 2000 | e16e7484 | 0 | 00000000 | 1 | 0 | 0| e101f000 | \Microsoft\Windows\UsrClass.dat
| e1705a78 | 77000 | e1705ad4 | 1000 | e1705bb0 | 30 | 0 | 0| e101c000 | ttings\Administrator\ntuser.dat
| e13d4b88 | 814000 | e146a000 | 1000 | e13d4cc0 | 255 | 0 | 0| e1460000 | emRoot\System32\Config\SOFTWARE
| e13ad008 | 23000 | e13ad064 | 1000 | e13ad140 | 9 | 0 | 0| e145e000 | temRoot\System32\Config\DEFAULT
| e13b3b88 | a000 | e13b3be4 | 1000 | e13b3cc0 | 3 | 0 | 0| e145d000 | emRoot\System32\Config\SECURITY
| e142d008 | 5000 | e142d064 | 0 | 00000000 | 2 | 0 | 0| e145f000 | <UNKNOWN>
| e11e3628 | 4000 | e11e3684 | 3000 | e11e3760 | 0 | 0 | 0| e11e4000 | <NONAME>
| e10168a8 | 1c1000 | e1016904 | 15000 | e10169e0 | 66 | 0 | 0| e1017000 | SYSTEM
| e10072c8 | 1000 | e1007324 | 0 | 00000000 | 0 | 0 | 0| e1010000 | <NONAME>
-------------------------------------------------------------------------------------------------------------
kd> !reg hashindex e16e7428
CmpCacheTable = e100a000
Hash Index[e16e7428] : 5ac
Hash Entry[e16e7428] : e100b6b0
kd> !reg openkeys e16e7428
Index 68: 7bab7683 kcb=e13314f8 cell=00000740 f=00200004 \REGISTRY\USER\S-1-5-21-1715567821-413027322-527237240-500_Classes\CLSID
Index 7a1: 48a30288 kcb=e13a3738 cell=00000020 f=002c0004 \REGISTRY\USER\S-1-5-21-1715567821-413027322-527237240-500_Classes
附加信息
关于注册表和它的组件的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!regkcb
!regkcb 扩展显示registry key control block。
语法
Windows NT 4.0的语法
!regkcb
Windows 2000的语法
!regkcb Address
参数
Address
指定key control block的地址。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
不可用
|
注释
在Windows NT 4.0中,会显示所有未交付的registry key control blocks。在Windows 2000中,会显示某个指定的registry key control block。
Windows XP和之后版本Windows中,应该使用!reg 扩展命令来替代。
每个注册表键都有一个包含它的许可权(permission)这样的属性的control block。
下面是Windows NT 4.0中的命令示例:
kd> !regkcb
1 - \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM
1 - \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM\MultifunctionAdapter\0
1 - \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM\MultifunctionAdapter\1
1 - \REGISTRY\Machine\System\ControlSet001\Control\Class
1 - \REGISTRY\Machine\System\ControlSet001\Control\ServiceGroupOrder
1 - \REGISTRY\Machine\System\ControlSet001\Control\ProductOptions
1 - \REGISTRY\Machine\System\ControlSet001\Control\PriorityControl
3 - \REGISTRY\Machine\System\ControlSet001\ENUM
....
附加信息
关于注册表和它的组件的信息,查看Mark Russinovich 和David Solomon编写的 Microsoft Windows Internals。
!rellist
!rellist 扩展命令显示Plug and Play relation list。
语法
!rellist Address [Flags]
参数
Address
指定relation list 的地址。
Flags
指定显示中要包含哪些附加信息。可以是下面这些位的任意组合(默认值为0):
Bit 1 (0x2)
显示中包含CM_RESOURCE_LIST。如果可能的话也还会包含boot resources list。
Bit 2 (0x4)
显示中包含resource requirements list (IO_RESOURCE_LIST)。
Bit 3 (0x8)
显示中包含translated CM_RESOURCE_LIST。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
附加信息
查看 Plug and Play 调试获得该扩展命令的应用。关于这些列表结构的信息,查看Windows Driver Kit (WDK) 文档。
!running
!running 扩展命令显示目标机上所有处理器上正在运行的线程的列表。
语法
!running [-i] [-t]
参数
-i
显示中也包含空闲处理器(idle processor)。
-t
显示每个处理器上的调用堆栈。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
不带参数时,!running 会显示所有活动处理器和空闲处理器的亲和性(affinity)。对于所有的活动处理器,还会显示处理器控制块(PRCB)的当前和下一线程字段,以及16个内置的排队自旋锁的状态。
下面是一个Itanium多处理器系统的示例:
0: kd> !running
System Processors 3 (affinity mask)
Idle Processors 0
Prcb Current Next
0 e0000000818f8000 e0000000818f9e50 e0000000866f12f0 ................
1 e000000086f16010 e00000008620ebe0 e000000086eddbc0 .O..............
每行末尾的16个字符是用来表示内置排队自旋锁的(PRCB 中的LockQueue)。点号( . )表示这个锁没有使用, O 表示这个锁被该处理器拥有, W 表示处理器排队在这个锁上。要查看自旋锁队列的更多信息,可以使用!qlocks。
下面的例子显示了活动和空闲处理器,以及它们的调用堆栈:
0: kd> !running -it
System Processors f (affinity mask)
Idle Processors f
All processors idle.
Prcb Current Next
0 ffdff120 805495a0 ................
ChildEBP RetAddr
8053e3f0 805329c2 nt!RtlpBreakWithStatusInstruction
8053e3f0 80533464 nt!_KeUpdateSystemTime+0x126
ffdff980 ffdff980 nt!KiIdleLoop+0x14
1 f87e0120 f87e2e60 ................
ChildEBP RetAddr
f87e0980 f87e0980 nt!KiIdleLoop+0x14
2 f87f0120 f87f2e60 ................
ChildEBP RetAddr
f87f0980 f87f0980 nt!KiIdleLoop+0x14
3 f8800120 f8802e60 ................
ChildEBP RetAddr
f8800980 f8800980 nt!KiIdleLoop+0x14
附加信息
关于调试多处理器计算机的信息,查看多处理器语法。
!scm
!scm 扩展显示指定的shared cache map。
语法
!scm Address
参数
Address
指定shared cache map的地址。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
不可用
|
注释
在Windows XP和之后版本的Windows中,可以使用dt nt!_SHARED_CACHE_MAP Address 命令来替代!scm。
附加信息
关于缓存管理的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
关于缓存管理扩展命令的信息,查看!cchelp。
!search
!search 扩展命令在物理内存的页面中搜索匹配指定目标的指针大小的数据。
语法
Windows 2000的语法
!search Data [ Delta [ StartPFN [ EndPFN ]]]
!search -?
Windows XP和之后的语法
!search [-s] [-p] Data [ Delta [ StartPFN [ EndPFN ]]]
!search -?
参数
-s
(Windows XP和之后) 忽略搜索中遇到的符号校验错误。在遇到很多"incorrect symbols for kernel"错误时非常有用。
-p
(Windows XP和之后) 将Data 当作32位值,不进行任何符号扩展。
Data
指定要搜索的数据。Data 必须和目标系统上的指针大小(32位或64位)一样。和Data精确匹配的值总是会显示出来。其他匹配的值根据Delta的设置,可能也会显示出来,详细信息可以查看后面的注释节。
Delta
指定内存中的值和Data之间允许存在的误差。查看注释部分获得详细信息。
StartPFN
指定要搜索的范围开始位置的页面帧序号(PFN)。如果省略,则从物理页面的最低地址开始搜索。
EndPFN
指定搜索范围结束处的页面帧序号(PFN)。如果省略,则在物理页面的最高地址处结束搜索。
-?
在调试器命令窗口中显示该扩展命令的帮助。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
如果指定了StartPFN 和EndPFN,它们会被当作要搜索的物理内存区域的开始和结束位置的页面帧序号。关于页面帧序号的说明,查看将虚拟地址转换成物理地址。如果省略StartPFN 和EndPFN ,则搜索所有物理内存。
在Windows 2000中,每个页面只会显示第一个匹配项,除非StartPFN和EndPFN相同。在Windows XP和之后,可以显示所有的匹配项。
!search 扩展会搜索指定的页面范围中所有内存,并且检查每个按ULONG_PTR 对齐的值。满足下面这些条件中至少一个的值会被显示出来:
- 精确匹配Data 的值。
- 如果Delta为0或省略: 和Data只有一个bit不同的数据。
- 如果Delta非0: 和Data相差最多为Delta的值。换句话说,即在范围[Data - Delta, Data + Delta]内。
- 如果Delta非0: 和上面的范围中(Data - Delta)小的那个数只相差一个bit的值。
大多数情况下,Data用来指定感兴趣的地址,但是允许指定任何ULONG_PTR 大小的数据。
由于调试器的搜索引擎的结构保存在目标机内存中,如果搜索所有内存(或者和这些结构有重合的区域),则会看到在这些结构保存的内存里面也找到了匹配。如果要消除这些匹配,可以搜索一个随机值,这样就能找出调试器的搜索结构保存的位置。
下面是一些例子。这个命令在PFN为0x237D 的内存中搜索0x80001230 到0x80001238之间的值:
kd> !search 80001234 4 237d 237d
下面的命令在PFN 0x2370 到0x237F的范围内搜索和0x0F100F0F相差不超过1 bit的值。精确匹配在下面用粗体标识,其他的有1个bit的差异:
kd> !search 0f100f0f 0 2370 237f
Searching PFNs in range 00002370 - 0000237F for [0F100F0F - 0F100F0F]
Pfn Offset Hit Va Pte
- - - - - - - - - - - - - - - - - - - - - - - - - - -
0000237B 00000368 0F000F0F 01003368 C0004014
0000237C 00000100 0F100F0F 01004100 C0004014
0000237D 000003A8 0F100F0F 010053A8 C0004014
0000237D 000003C8 0F100F8F 010053C8 C0004014
0000237D 000003E8 0F100F0F 010053E8 C0004014
0000237D 00000408 0F100F0F 01005408 C0004014
0000237D 00000428 0F100F8F 01005428 C0004014
Search done.
显示出来的列有这些: Pfn 是页面的页面帧序号(PFN);Offset 是在页面中的偏移;Hit 是在该地址的值;Va 是该物理地址映射到的虚拟地址(如果存在并且可以获得);Pte是页表项(PTE)。
要计算物理地址(疑为虚拟地址 — 译者),可以将PFN左移3个16进制数字(12 bit)然后加上偏移。例如,上表中最后以行的虚拟地址是0x0237D000 + 0x428 = 0x02347D428。
附加信息
更多显示和搜索物理内存的方法,查看读写内存。
cc682/NetRoc
http://netroc682.spaces.live.com/
!processfields
!processfields 扩展命令显示执行进程块(EPROCESS)中字段的名字和偏移。
语法
!processfields
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
不可用(查看注释)
|
注释
该扩展命令在Windows XP和之后的系统中都不可用。可以直接使用 dt (Display Type) 命令显示EPROCESS结构:
kd> dt nt!_EPROCESS
下面是!processfields 在Windows 2000系统中的示例:
kd> !processfields
EPROCESS structure offsets:
Pcb: 0x0
ExitStatus: 0x6c
LockEvent: 0x70
LockCount: 0x80
CreateTime: 0x88
ExitTime: 0x90
LockOwner: 0x98
UniqueProcessId: 0x9c
ActiveProcessLinks: 0xa0
QuotaPeakPoolUsage[0]: 0xa8
QuotaPoolUsage[0]: 0xb0
PagefileUsage: 0xb8
CommitCharge: 0xbc
PeakPagefileUsage: 0xc0
PeakVirtualSize: 0xc4
VirtualSize: 0xc8
Vm: 0xd0
DebugPort: 0x120
ExceptionPort: 0x124
ObjectTable: 0x128
Token: 0x12c
WorkingSetLock: 0x130
WorkingSetPage: 0x150
ProcessOutswapEnabled: 0x154
ProcessOutswapped: 0x155
AddressSpaceInitialized: 0x156
AddressSpaceDeleted: 0x157
AddressCreationLock: 0x158
ForkInProgress: 0x17c
VmOperation: 0x180
VmOperationEvent: 0x184
PageDirectoryPte: 0x1f0
LastFaultCount: 0x18c
VadRoot: 0x194
VadHint: 0x198
CloneRoot: 0x19c
NumberOfPrivatePages: 0x1a0
NumberOfLockedPages: 0x1a4
ForkWasSuccessful: 0x182
ExitProcessCalled: 0x1aa
CreateProcessReported: 0x1ab
SectionHandle: 0x1ac
Peb: 0x1b0
SectionBaseAddress: 0x1b4
QuotaBlock: 0x1b8
LastThreadExitStatus: 0x1bc
WorkingSetWatch: 0x1c0
InheritedFromUniqueProcessId: 0x1c8
GrantedAccess: 0x1cc
DefaultHardErrorProcessing 0x1d0
LdtInformation: 0x1d4
VadFreeHint: 0x1d8
VdmObjects: 0x1dc
DeviceMap: 0x1e0
ImageFileName[0]: 0x1fc
VmTrimFaultValue: 0x20c
Win32Process: 0x214
Win32WindowStation: 0x1c4
附加信息
关于EPROCESS块的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!psp
!psp 扩展用于显示指定地址处的处理器状态参数寄存器(processor state parameter (PSP) register)。
该命令仅在Itanium目标机上支持。
语法
!psp Address [DisplayLevel]
参数
Address
指定要显示的PSP寄存器的16进制地址。
DisplayLevel
可以是下面这些选项中任意一个:
0
仅显示PSP字段的值。这是默认情况。
1
显示非保留和非忽略的PSP字段的详细信息。
2
显示所有PSP字段的详细信息,包括被忽略或保留的那些。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
!pte
!pte 扩展显示指定地址的页表项(page table entry (PTE))和页目录项(page directory entry (PDE))。
语法
Windows NT 4.0 和Windows 2000的语法
!pte VirtualAddress
!pte PTE
!pte LiteralAddress 1
!pte StartAddress EndAddress
Windows XP和之后的语法
!pte VirtualAddress
!pte PTE
!pte LiteralAddress 1
参数
VirtualAddress
指定需要查看页表的虚拟地址。
PTE
指定实际的PTE的地址。
LiteralAddress 1
指定实际的PTE或PDE的地址。
StartAddress
(仅x86 或x64 目标机;仅 Windows NT 4.0 和Windows 2000) 指定某个范围的开始的虚拟地址。该范围内的所有页表都会被显示出来。
EndAddress
(仅x86 或x64 目标机; 仅Windows NT 4.0 和Windows 2000) 指定某个范围的结束的虚拟地址。该范围内的所有页表都会被显示出来。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
如果指定了一个参数,并且该参数是一个用于保存页表的内存区域中的地址,那么调试器将它当作一个PTE参数。该参数被当作要查看的PTE的实际地址,调试器会显示该PTE以及相应的PDE。
如果指定的参数不在这个范围内,调试器把它当作VirtualAddress。会显示用于映射这个地址的PTE和PDE。
如果指定了两个参数,并且第二个参数是1 (或者更小的数字),调试器将第一个参数当作LiteralAddress。这个地址会被当作PTE或者PDE的实际地址,并且显示相应的数据(可能是错误的)。
(仅x86 或x64目标机) 如果提供了两个参数,并且第二个参数比第一个大,调试器将它们当作StartAddress 和EndAddress。命令会显示指定的内存范围中每个页面的PTE。
使用!sysptes扩展命令查看所有系统PTE的列表。
下面是x86目标机上的示例:
kd> !pte 801544f4
801544F4 - PDE at C0300800 PTE at C0200550
contains 0003B163 contains 00154121
pfn 3b G-DA--KWV pfn 154 G--A--KRV
输出的第一行会再次显示被查看的虚拟地址。然后是包含该地址内存映射(virtual-physical mapping)信息的PDE和PTE的虚拟地址。
第二行是PDE和PTE的实际内容。
第三行是对这些内容的分析,将它们分解成页面帧序号(PFN)和状态位(status bits)。
查看 !pfn扩展命令或者 将虚拟地址转换成物理地址小节来获得如何理解和使用PFN的信息。
在x86和x64目标机上,PDE和PTE的状态位在下表中列出。!pte 的显示会用大写字母或者虚线来表示这些位,并且还添加其他信息。
位
|
设置时的显示
|
清除时的显示
|
意义
|
0x200
|
C
|
-
|
写时复制(Copy on write)
|
0x100
|
G
|
-
|
全局页面(Global)
|
0x80
|
L
|
-
|
大页面(Large page)。只有PDE有,PTE中没有。
|
0x40
|
D
|
-
|
脏页面(Dirty)
|
0x20
|
A
|
-
|
已访问(Accessed)
|
0x10
|
N
|
-
|
禁止缓存(Cache disabled)
|
0x8
|
T
|
-
|
通写(Write-through)
|
0x4
|
U
|
K
|
所有者(用户模式或内核模式)。
|
0x2
|
W
|
R
|
可写或者只读。只有在多处理器计算机和任何运行Windows Vista和之后系统的机器上有。
|
0x1
|
V
|
|
有效位(Valid)
|
|
E
|
-
|
可执行页面。对于包括很多x86系统在内的不支持硬件执行/非执行标志位的平台,总是显示E。
|
在Itanium目标机上,PDE和PTE的状态位和PPE中有少许不同。Itanium PPE位有下面这些:
设置时的显示
|
清除时的显示
|
意义
|
V
|
|
有效位(Valid)
|
U
|
K
|
所有者(用户模式或内核模式)。
|
D
|
-
|
脏页面(Dirty)
|
A
|
-
|
已访问(Accessed)
|
W
|
R
|
可写或者只读。只有在多处理器计算机和任何运行Windows Vista和之后系统的机器上有。
|
E
|
-
|
执行(Execute)
|
C
|
-
|
写时复制(Copy on write)
|
附加信息
关于页表、页目录和这些状态位的说明,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!pte2va
!pte2va 扩展命令显示指定的页表项(PTE)对应的虚拟地址。
语法
!pte2va Address
Address
指定PTE。
DLL
Windows NT 4.0
|
不可用
|
Windows 2000
|
不可用
|
Windows XP和之后
|
Kdexts.dll
|
注释
要查看指定的PTE的内容,使用!pte命令。
下面是!pte2va 扩展的输出示例:
kd> !pte2va 9230
000800000248c000
附加信息
关于页表和PTE的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
!ptov
!ptov扩展显示给定进程的整个物理地址到虚拟地址的映射(physical-to-virtual map)。
语法
!ptov PFN
参数
PFN
指定进程的页目录基址(directory base)的页面帧序号(PFN)。这和去掉最后三个16进制数字的页目录基地址相同 (即右移12位)。
DLL
Windows NT 4.0
|
Kdextx86.dll
|
Windows 2000
|
Kdextx86.dll
|
Windows XP和之后
|
Kdexts.dll
|
注释
下面是一个示例。首先使用!process扩展来获得需要的进程的页目录基址:
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
....
PROCESS ff779190 SessionId: 0 Cid: 04fc Peb: 7ffdf000 ParentCid: 0394
DirBase: 098fd000 ObjectTable: e1646b30 TableSize: 8.
Image: MyApp.exe
这里的页目录基址是0x098FD000。去掉末尾的三个0,结果为0x098FD。这就是页目录基址的页面帧序号(PFN)。
将这个数字传递给!ptov:
kd> !ptov 98fd
7119000 10000
a21a000 20000
6133000 12e000
9de9000 12f000
2b0c000 130000
87cd000 131000
aaf6000 140000
... ...
左边一列的数字是映射到该进程的每个内存页面的物理地址。右边一列是它们映射到的虚拟地址。
全部的输出会非常长。
附加信息
相关主题,查看!vtop、 !vpdd、以及 将虚拟地址转换成物理地址。关于页表和页目录的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。
摘要: cc682/NetRoc
http://netroc682.spaces.live.com/
!poolfind
!poolfind 扩展命令在非分页和分页内存中查找指定的pool tag。
语法
Windows NT 4.0中的语法
!poolfind TagString [PoolType]
Windows 2000和之后
...
阅读全文
摘要: cc682/NetRoc
http://netroc682.spaces.live.com/
!pars
!pars 扩展显示指定的processor application registers file。
语法
!pars Address
参数
Address
指定processor application registers file的地址。...
阅读全文