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)