NetRoc's Blog

N-Tech

 

空间转移

由于blog的形式查阅帮助文档不便,所以还是转移到了专门的空间中,做成了在线Help的形式。目前翻译的文档由于需要修复链接,以及更新新版WinDbg文档中的内容,所以还在陆续整理中。
另外还挂了一个论坛和另一个blog上去,刚刚开始做,所以各方面都还很不完善,正在努力中:)
http://www.dbgtech.net/

posted @ 2008-09-03 22:16 NetRoc 阅读(324) | 评论 (0)编辑 收藏

WinDbg 文档翻译----91

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !evlog !evlog 扩展命令用于显示、修改或者备份事件日志(event log)。 语法 !evlog addsource [-d] [-s Source] [-t Type] [-f MsgFil...  阅读全文

posted @ 2008-08-18 11:24 NetRoc 阅读(990) | 评论 (1)编辑 收藏

WinDbg 文档翻译----90

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.dllverifier.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|-wKeyPath[!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 [vCSR-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)

posted @ 2008-08-12 15:06 NetRoc 阅读(533) | 评论 (0)编辑 收藏

WinDbg 文档翻译----89

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !vm !vm扩展命令显示目标系统中虚拟内存使用统计的摘要信息。 语法 Windows NT 4.0的语法 !vm  Windows 2000和之后的语法 !vm [Flags]  参数 Flags (Windows ...  阅读全文

posted @ 2008-08-11 13:24 NetRoc 阅读(523) | 评论 (0)编辑 收藏

WinDbg 文档翻译----88

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !thread !thread 扩展显示目标系统中线程包括ETHREAD块在内的摘要信息。该命令只能在内核模式调试下使用。 这个扩展命令和.thread (Set Register Context)命令不同。 语法 Windows NT 4.0 和Windows ...  阅读全文

posted @ 2008-08-11 13:23 NetRoc 阅读(817) | 评论 (0)编辑 收藏

WinDbg 文档翻译----87

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !searchpte !searchpte 在物理内存中搜索指定的页面帧序号(PFN)。 语法 !searchpte PFN !searchpte -?  参数 PFN 以16进制格式指定PFN。 -? 在调试器命令窗口中显示该...  阅读全文

posted @ 2008-08-04 13:48 NetRoc 阅读(490) | 评论 (0)编辑 收藏

WinDbg 文档翻译----86

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] [-pData [ 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

注释

如果指定了StartPFNEndPFN,它们会被当作要搜索的物理内存区域的开始和结束位置的页面帧序号。关于页面帧序号的说明,查看将虚拟地址转换成物理地址。如果省略StartPFNEndPFN ,则搜索所有物理内存。

在Windows 2000中,每个页面只会显示第一个匹配项,除非StartPFNEndPFN相同。在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。

附加信息

更多显示和搜索物理内存的方法,查看读写内存

posted @ 2008-08-04 13:47 NetRoc 阅读(514) | 评论 (0)编辑 收藏

WinDbg 文档翻译----85

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目标机) 如果提供了两个参数,并且第二个参数比第一个大,调试器将它们当作StartAddressEndAddress。命令会显示指定的内存范围中每个页面的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

posted @ 2008-07-30 14:59 NetRoc 阅读(544) | 评论 (0)编辑 收藏

WinDbg 文档翻译----84

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !poolfind !poolfind 扩展命令在非分页和分页内存中查找指定的pool tag。 语法 Windows NT 4.0中的语法 !poolfind TagString [PoolType]  Windows 2000和之后 ...  阅读全文

posted @ 2008-07-30 14:58 NetRoc 阅读(633) | 评论 (1)编辑 收藏

WinDbg 文档翻译----83

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !pars !pars 扩展显示指定的processor application registers file。 语法 !pars Address  参数 Address 指定processor application registers file的地址。...  阅读全文

posted @ 2008-07-30 14:57 NetRoc 阅读(753) | 评论 (0)编辑 收藏

仅列出标题
共10页: 1 2 3 4 5 6 7 8 9 Last 

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜