More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  netroc的共享空间ProfileFriendsBlogMore Tools Explore the Spaces community

netroc的共享空间

感谢访问!
  • Niklas
    August 11 9:29 AM
    Hi NetRoc!
     
    I wonder if you mind mail me the xtrap project with sources?
    I am wery annoyed by Xtrap and I have been looking at it
    for along time to work around it but it fails. I need write SSDT
    hooks and remove int1 in IDT.
     
    regards /Niklas
View space
Pony Chen
View space
wangzc
View space
最帅的日志
View space
guyiboy
View space
lifar
View space
kula99

August 18

WinDbg 文档翻译----91

cc682/NetRoc

http://netroc682.spaces.live.com/

!evlog

!evlog 扩展命令用于显示、修改或者备份事件日志(event log)。

语法

!evlog addsource [-d] [-s Source] [-t Type] [-f MsgFile
!evlog backup [-d] [-l EventLog] [-f BackupFile
!evlog clear [-!] [-d] [-l EventLog] [-f BackupFile
!evlog info 
!evlog option [-d] [-!] [-n Count] [ -l EventLog [ -+ | -r RecordBound ]] [-o Order] [-w Width
!evlog read [-d] [-l EventLog] [-s Source] [-e ID] [-c Category] [-t Type] [-n Count] [-r Record
!evlog report [-s Source] [-e ID] [-c Category] [-t TypeMessage 
!evlog [Option-? 

参数

addsource

将一个事件源(event source)加入到注册表中。默认情况下,只会添加来自DebuggerExtensions 的事件(用于支持!evlog report)。

backup

对指定的事件日志创建一个备份,并且写入到文件中。

clear

清除指定的事件日志,并且选择性的创建一个文件用于保存它的旧内容。

info

显示事件日志的摘要信息。

option

设置默认的搜索选项。这些选项用于之后的!evlog read 命令。

read

显示记录到指定的事件日志中的事件清单。输出的详细程度 — 例如要显示的记录条数和排序方式 — 可以通过!evlog read 的参数或者之前使用!evlog option 来控制。

report

将某个事件记录写入应用程序事件日志(application event log)中。

-d

指定要使用的所有默认值。-d 选项仅在省略了其他所有参数时需要使用。但是,和!evlog option 一起使用时可以用来显示已存在的默认设置。

-!

!evlog option一起使用来重置为默认选项。和!evlog clear一起使用 阻止创建备份文件。

Source

指定事件源。默认值为DebuggerExtensions

Type

指定成功类型(success type)。可能的Type值有 1 (Error)、 2 (Warning)、 4 (Information)、 8 (Audit_Success)、或者16 (Audit_Failure)。值为0表示成功。对于 !evlog read!evlog report,默认是成功Success (0)。对于!evlog addsource,可以结合使用这些位,并且默认设置了所有位(31)。

MsgFile

指定消息文件的路径和文件名。如果省略路径,则使用当前Uext.dll所在目录。

EventLog

对于!evlog read!evlog backup、和!evlog clearEventLog 指定要读取哪个事件日志。可能的值有ApplicationSystem、和Security。默认为Application

对于!evlog optionEventLog 指定要设置最大数量(maximum count)的事件日志。可能的值有AllApplicationSystemSecurity。默认为All

BackupFile

指定备份文件的路径和文件名。默认位置是当前目录。默认文件名是EventLog_backup.evtEventLog 是在该命令中使用的事件日志。如果文件已经存在,命令会终止执行。

Count

指定要获取的记录的最大数量。默认为20。

-+

指定用后面的!evlog read命令获取的最大记录数量作为当前最大记录数量。(换句话说,只要前面没有进行过搜索就不会显示出记录来。)

RecordBound

指定之后的!evlog read 命令能获取的最大记录数量。如果指定0,则不会有限制 — 这是默认。

Record

如果没有包含-n Count-r Record 用于指定要获取的记录条数。如果包含了-n CountRecord用于指定显示从第几条记录开始。

Order

指定搜索顺序,可以是ForwardsBackwards。默认为Forwards。反向搜索会从最近一次记录到事件日志中的记录开始,并且反方向进行搜索直到找到匹配项。

Width

指定数据显示的宽度,以字符为单位。这是在Data部分的显示宽度。默认为8个字符。

ID

指定事件之前要显示的前缀。可以使用的值有 0 (no prefix)、 1000 (Information)、2000 (Success)、 3000 (Warning)、和 4000 (Error)。默认为0。

Category

指定事件种类。可使用的值有0 (no category)、 1 (Devices)、 2 (Disk)、 3 (Printers)、 4 (Services)、 5 (Shell)、6 (System_Event)和 7 (Network)。默认为0。

Message

指定要添加到事件描述中的文本消息。

Option

指定要显示某个!evlog 选项的帮助文本。

-?

在调试器命令窗口中显示该扩展命令的简短帮助。

DLL

Windows NT 4.0

Uext.dll

Windows 2000

Uext.dll

Windows XP和之后

Uext.dll

 

!evlog 扩展只能在活动调试时使用。

注释

使用!evlog addsource 在注册表中添加了事件源之后,可以使用!dreg命令来查看它的值。例如:

0:000> !dreg hklm\system\currentcontrolset\services\eventlog\Application\<source>!* 

!evlog option 命令用于为!evlog read 设置新的默认值。这可以避免在重复使用!evlog read 时每次都需要输入所有参数。使用-+参数或者-r Records 参数可以为搜索进行限制,在搜索了指定数量的记录之后终止命令。如果仅对某个事件之后的记录感兴趣,那么这种限制是很有用的。

使用!evlog report前,应该用!evlog addsource 来在注册表中配置事件源。这种配置之后,事件查看器就可以识别各种事件ID了。

下面是!evlog info 扩展命令的示例:

0:000> !evlog info -?
--------------------------------
Application Event Log:
  # Records       : 4362
  Oldest Record # : 1
  Newest Record # : 4362
  Event Log Full  : false
--------------------------------
System Event Log:
  # Records       : 2296
  Oldest Record # : 1
  Newest Record # : 2296
  Event Log Full  : false
--------------------------------
Security Event Log:
  # Records       : 54544
  Oldest Record # : 1
  Newest Record # : 54544
  Event Log Full  : false
--------------------------------

0:000> !evlog option -n 4
Default EvLog Option Settings:
--------------------------------
Max Records Returned: 4
Search Order:         Backwards
Data Display Width:   8
--------------------------------
Bounding Record Numbers:
  Application Event Log: 0
  System Event Log:      0
  Security Event Log:    0
--------------------------------

0:000> !evlog read -l application
-------------- 01 --------------
Record #: 4364

Event Type:      Error (1)
Event Source:    Userenv
Event Category:  None (0)
Event ID:        1000 (0xC00003E8)
Date:            06/06/2002
Time:            18:03:17
Description:     (1 strings)
The Group Policy client-side extension Security was passed flags (17) and returned a failure status code of (87).

-------------- 02 --------------
Record #: 4363

Event Type:      Warning (2)
Event Source:    SceCli
Event Category:  None (0)
Event ID:        1202 (0x800004B2)
Date:            06/06/2002
Time:            18:03:17
Description:     (1 strings)
0x57 : The parameter is incorrect.
Please look for more details in TroubleShooting section in Security Help.

-------------- 03 --------------
Record #: 4362

Event Type:      Error (1)
Event Source:    Userenv
Event Category:  None (0)
Event ID:        1000 (0xC00003E8)
Date:            06/06/2002
Time:            16:04:08
Description:     (1 strings)
The Group Policy client-side extension Security was passed flags (17) and returned a failure status code of (87).

-------------- 04 --------------
Record #: 4361

Event Type:      Warning (2)
Event Source:    SceCli
Event Category:  None (0)
Event ID:        1202 (0x800004B2)
Date:            06/06/2002
Time:            16:04:08
Description:     (1 strings)
0x57 : The parameter is incorrect.
Please look for more details in TroubleShooting section in Security Help.
WARNING: Max record count (4) exceeded, increase record count to view more

!findstack

!findstack 扩展命令用于在所有调用堆栈中定位包含指定符号或模块的位置。

语法

!findstack Symbol [DisplayLevel]
!findstack -? 

参数

Symbol

指定符号或者模块。

DisplayLevel

指定显示中要包含的内容。可以是下面这些值中的一个,默认值是1。

0

仅显示每个包含Symbol的线程的ID。

1

显示包含Symbol的每个线程的ID和frame。

2

显示每个包含Symbol的线程的整个调用堆栈。

-?

在调试器命令窗口中显示该扩展命令的简单帮助。

DLL

Windows NT 4.0

Uext.dll

Windows 2000

Uext.dll

Windows XP和之后

Uext.dll

注释

内核模式下的!stacks命令可以显示所有线程的调用堆栈和状态摘要信息。

下面是该扩展命令输出的示例:

0:023> !uext.findstack wininet
Thread 009, 2 frame(s) match
        * 06 03eaffac 771d9263 wininet!ICAsyncThread::SelectThread+0x22a
        * 07 03eaffb4 7c80b50b wininet!ICAsyncThread::SelectThreadWrapper+0xd
 
Thread 011, 2 frame(s) match
        * 04 03f6ffb0 771cda1d wininet!AUTO_PROXY_DLLS::DoThreadProcessing+0xa1
        * 05 03f6ffb4 7c80b50b wininet!AutoProxyThreadFunc+0xb
 
Thread 020, 6 frame(s) match
        * 18 090dfde8 771db73a wininet!CheckForNoNetOverride+0x9c
        * 19 090dfe18 771c5e4d wininet!InternetAutodialIfNotLocalHost+0x220
        * 20 090dfe8c 771c5d6a wininet!ParseUrlForHttp_Fsm+0x135
        * 21 090dfe98 771bcb2c wininet!CFsm_ParseUrlForHttp::RunSM+0x2b
        * 22 090dfeb0 771d734a wininet!CFsm::Run+0x39
        * 23 090dfee0 77f6ad84 wininet!CFsm::RunWorkItem+0x79
 
Thread 023, 9 frame(s) match
        * 16 0bd4fe00 771bd256 wininet!ICSocket::Connect_Start+0x17e
        * 17 0bd4fe0c 771bcb2c wininet!CFsm_SocketConnect::RunSM+0x42
        * 18 0bd4fe24 771bcada wininet!CFsm::Run+0x39
        * 19 0bd4fe3c 771bd22b wininet!DoFsm+0x25
        * 20 0bd4fe4c 771bd706 wininet!ICSocket::Connect+0x32
        * 21 0bd4fe8c 771bd4cb wininet!HTTP_REQUEST_HANDLE_OBJECT::OpenConnection_Fsm+0x391
        * 22 0bd4fe98 771bcb2c wininet!CFsm_OpenConnection::RunSM+0x33
        * 23 0bd4feb0 771d734a wininet!CFsm::Run+0x39
        * 24 0bd4fee0 77f6ad84 wininet!CFsm::RunWorkItem+0x79
 
0:023> !uext.findstack wininet!CFsm::Run 0
Thread 020, 2 frame(s) match
Thread 023, 3 frame(s) match

0:023> !uext.findstack wininet!CFsm 0
Thread 020, 3 frame(s) match
Thread 023, 5 frame(s) match

附加信息

关于堆栈回溯和显示调用堆栈的其他方式的信息,查看查看调用堆栈k, kb, kd, kp, kP, kv (Display Stack Backtrace) 命令。

!gatom

!gatom 扩展用于显示全局atom表(global atom table)。

语法

!gatom 

DLL

Windows NT 4.0

Ntsdexts.dll

Windows 2000

Ntsdexts.dll

Windows XP和之后

Ntsdexts.dll

附加信息

关于全局atom表的信息,查看Microsoft Windows SDK文档。

!igrep

!igrep 扩展命令在反汇编中搜索指定的模板。

语法

!igrep [Pattern [StartAddress]] 

参数

Pattern

指定要搜索的模板。如果省略,则使用前一次的Pattern

StartAddress

指定开始搜索的16进制地址。如果省略,则使用当前程序计数器。

DLL

Windows NT 4.0

Ntsdexts.dll

Windows 2000

Ntsdexts.dll

Windows XP和之后

不可用

!locks (!ntsdexts.locks)

Ntsdexts.dll中的!locks 扩展命令显示当前进程关联的临界区(critical section)的清单。

该扩展命令不要和!kdext*.locks 命令混淆。

语法

!locks [Options

参数

Options

指定要显示的信息数量。可以是下面这些选项的任意组合:

-v

显示所有临界区,包括当前没有被持有的那些。

-o

(Windows XP和之后) 仅显示孤立的信息(orphaned information)(没有指向合法的临界区的指针)。

DLL

Windows NT 4.0

Ntsdexts.dll

Windows 2000

Ntsdexts.dll

Windows XP和之后

Ntsdexts.dll

注释

该扩展命令会显示所有通过调用RtlInitializeCriticalSection 初始化的临界区。如果没有临界区,那么不会产生输出。

示例如下:

0:000> !locks

CritSec w3svc!g_pWamDictator+a0 at 68C2C298
LockCount          0
RecursionCount     1
OwningThread       d1
EntryCount         1
ContentionCount    0
*** Locked

CritSec SMTPSVC+66a30 at 67906A30
LockCount          0
RecursionCount     1
OwningThread       d0
EntryCount         1
ContentionCount    0
*** Locked

附加信息

关于可以显示临界区信息的其他命令和扩展命令,查看显示临界区。关于临界区的信息,查看Microsoft Windows SDK文档、Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!runaway

!runaway扩展命令显示每个线程消费的时间。

语法

!runaway [Flags

参数

Flags

指定要显示哪些信息。Flags 可以是下面这些位的任意组合。默认值为0x1:

Bit 0 (0x1)

让调试器显示每个线程消耗的用户模式时间(user time)。

Bit 1 (0x2)

显示每个线程消耗的内核时间(kernel time)。

Bit 2 (0x4)

显示每个线程从创建开始经历了多少时间。

DLL

Windows NT 4.0

Uext.dll

Windows 2000

Uext.dll
Ntsdexts.dll

Windows XP和之后

Uext.dll
Ntsdexts.dll

!runaway 扩展命令只能在活动调试时,或者调试通过.dump /mt.dump /ma创建的dump文件时使用。

注释

该扩展命令可以用来快速找出哪些线程循环失去控制消耗了太多CPU时间。

输出中以调试器的内部线程号和16进制线程ID来标识每个线程。还会显示调试器ID。

下面是示例:


0:001> !runaway 7

 User Mode Time
 Thread       Time
 0:55c        0:00:00.0093
 1:1a4        0:00:00.0000

 Kernel Mode Time
 Thread       Time
 0:55c        0:00:00.0140
 1:1a4        0:00:00.0000

 Elapsed Time
 Thread       Time
 0:55c        0:00:43.0533
 1:1a4        0:00:25.0876

附加信息

关于用户模式下线程的信息,查看控制进程和线程。关于对进程和线程进行分析的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!threadtoken

!threadtoken 扩展命令显示当前线程的模拟状态(impersonation state)。

语法

!threadtoken 

DLL

Windows NT 4.0

不可用

Windows 2000

Ntsdexts.dll

Windows XP和之后

不可用

注释

!threadtoken 扩展命令在Windows XP和之后版本中已经废除。使用!token 来替代。

如果当前线程处于模拟状态下(impersonating),那么会显示它使用的令牌(token)。

否则,会出现"Thread is not impersonating"信息。并且显示进程的令牌。

令牌的显示的格式和使用!handle 来显示令牌句柄时一样。

下面是示例:

0:000> ~
.  0  id: 1d0.55c   Suspend: 1 Teb 7ffde000 Unfrozen
#  1  id: 1d0.1a4   Suspend: 1 Teb 7ffdd000 Unfrozen

0:000> !threadtoken

***Thread is not impersonating, using process token***
    Auth Id    0 : 0x1c93d
    Type       Primary
    Imp Level  Anonymous
     Token Id  0 : 0x5e8c19
     Mod Id    0 : 0x5e8c12
     Dyn Chg   0x1f4
     Dyn Avail 0x1a4
     Groups    26
     Privs     17
     User      S-1-5-21-2127521184-1604012920-1887927527-74790
     Groups    26
               S-1-5-21-2127521184-1604012920-1887927527-513
               S-1-1-0
               S-1-5-32-544
               S-1-5-32-545
               S-1-5-21-2127521184-1604012920-1887927527-277551
               S-1-5-21-2127521184-1604012920-1887927527-211604
               S-1-5-21-2127521184-1604012920-1887927527-10546
               S-1-5-21-2127521184-1604012920-1887927527-246657
               S-1-5-21-2127521184-1604012920-1887927527-277552
               S-1-5-21-2127521184-1604012920-1887927527-416040
               S-1-5-21-2127521184-1604012920-1887927527-96548
               S-1-5-21-2127521184-1604012920-1887927527-262644
               S-1-5-21-2127521184-1604012920-1887927527-155802
               S-1-5-21-2127521184-1604012920-1887927527-158763
               S-1-5-21-2127521184-1604012920-1887927527-279132
               S-1-5-21-2127521184-1604012920-1887927527-443952
               S-1-5-21-2127521184-1604012920-1887927527-175772
               S-1-5-21-2127521184-1604012920-1887927527-388472
               S-1-5-21-2127521184-1604012920-1887927527-443950
               S-1-5-21-2127521184-1604012920-1887927527-266975
               S-1-5-21-2127521184-1604012920-1887927527-158181
               S-1-5-21-2127521184-1604012920-1887927527-279435
               S-1-5-5-0-116804
               S-1-2-0
               S-1-5-4
               S-1-5-11
     Privileges    17
               SeUndockPrivilege ( Enabled Default )
               SeTakeOwnershipPrivilege ( )
               SeShutdownPrivilege ( )
               SeDebugPrivilege ( )
               SeIncreaseBasePriorityPrivilege ( )
               SeAuditPrivilege ( )
               SeSyncAgentPrivilege ( )
               SeLoadDriverPrivilege ( )
               SeSystemEnvironmentPrivilege ( Enabled )
               SeRemoteShutdownPrivilege ( )
               SeProfileSingleProcessPrivilege ( )
               SeCreatePagefilePrivilege ( )
               SeCreatePermanentPrivilege ( )
               SeSystemProfilePrivilege ( Enabled )
               SeBackupPrivilege ( )
               SeMachineAccountPrivilege ( )
               SeEnableDelegationPrivilege ( Enabled )

附加信息

关于线程和模拟的信息,查看线程和模拟(impersonation)的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!uniqstack

!uniqstack 扩展命令显示当前进程中所有线程的调用堆栈,除开重复的那些。

语法

!uniqstack [ b | v | p ] [ ]

参数

b

显示中包含传递给每个函数的前3个参数。

v

显示帧指针省略信息(frame pointer omission (FPO) information)。在x86处理器上,还会显示调用约定的信息。

p

显示调用堆栈中每个函数的完整参数。会列出每个参数的数据类型、名字和值。需要完整符号信息

n

显示帧序号(frame number)。

DLL

Windows NT 4.0

Uext.dll

Windows 2000

Uext.dll

Windows XP和之后

Uext.dll

注释

除了不显示重复的调用堆栈之外,该命令和k, kb, kd, kp, kP, kv (Display Stack Backtrace) 命令类似。

例如:

0:000> !uniqstack
Processing 14 threads, please wait

.  0  Id: f0f0f0f0.15c Suspend: 1 Teb: 00000000`7fff8000 Unfrozen
      Priority: 0
Child-SP          Child-BSP         RetAddr           Call Site
00000000`0006e5e0 00000000`00070420 00000000`6b009840 wow64!Wow64NotifyDebugger+0x40 [d:\xpclient\base\wow64\wow64\wow64.c @ 581]
00000000`0006e600 00000000`000703d0 00000000`6b03db00 wow64!Wow64KiRaiseException+0x1a0 [d:\xpclient\base\wow64\wow64\wow64.c @ 649]
00000000`0006e950 00000000`000703b0 00000000`6b008520 wow64!whNtRaiseException+0x40
00000000`0006e950 00000000`00070368 00000000`6b1845e0 wow64!Wow64SystemService+0x220 [d:\xpclient\base\wow64\wow64\wow64.c @ 1100]
00000000`0006e9b0 00000000`00070310 00000000`6b009980 wow64cpu!CpuSimulate+0x3a0 [d:\xpclient\base\wow64\cpu\ia64\cpu\cpumain.c @ 730]
00000000`0006e9d0 00000000`000702d0 00000000`6b009ff0 wow64!RunCpuSimulation+0x60 [d:\xpclient\base\wow64\wow64\wow64.c @ 1168]
00000000`0006e9e0 00000000`00070248 00000000`77ea4a10 wow64!Wow64LdrpInitialize+0x5d0 [d:\xpclient\base\wow64\wow64\wow64.c @ 248]
00000000`0006f290 00000000`000700e0 00000000`77ea5d60 ntdll!LdrpInitializeProcess+0x2150 [d:\xpclient\base\ntdll\ldrinit.c @ 1817]
00000000`0006f4c0 00000000`00070028 00000000`77ed6000 ntdll!LdrpInitialize+0x560 [d:\xpclient\base\ntdll\ldrinit.c @ 553]
00000000`0006f550 00000000`00070000 00000000`77ed9000 ntdll!LdrInitializeThunk+0x20 [D:\xpclient\base\ntdll\daytona\..\ia64\ldrthunk.s @ 80]
00000000`0006f550 00000000`00070000 00000000`77ca78a0 ntdll!KiUserApcDispatch+0x50 [D:\xpclient\base\ntos\rtl\user\..\ia64\trampoln.s @ 203]
00000000`0006fff0 00000000`00070000 00000000`00000000 0x77ca78a0

.  1  Id: f0f0f0f0.718 Suspend: 1 Teb: 00000000`7fff4000 Unfrozen
      Priority: 0
Child-SP          Child-BSP         RetAddr           Call Site
00000000`0043eb50 00000000`00440250 00000000`6b008520 wow64!whNtDelayExecution+0x150 [d:\xpclient\base\wow64\whnt32\obj\ia64\whnt32.c @ 24541]
00000000`0043eb80 00000000`00440208 00000000`6b1845e0 wow64!Wow64SystemService+0x220 [d:\xpclient\base\wow64\wow64\wow64.c @ 1100]
00000000`0043ebe0 00000000`004401a8 00000000`6b009980 wow64cpu!CpuSimulate+0x3a0 [d:\xpclient\base\wow64\cpu\ia64\cpu\cpumain.c @ 730]
00000000`0043ec00 00000000`00440168 00000000`6b009ff0 wow64!RunCpuSimulation+0x60 [d:\xpclient\base\wow64\wow64\wow64.c @ 1168]
00000000`0043ec10 00000000`004400e0 00000000`77ea5f50 wow64!Wow64LdrpInitialize+0x5d0 [d:\xpclient\base\wow64\wow64\wow64.c @ 248]
00000000`0043f4c0 00000000`00440028 00000000`77ed6000 ntdll!LdrpInitialize+0x750 [d:\xpclient\base\ntdll\ldrinit.c @ 626]
00000000`0043f550 00000000`00440000 00000000`77ed9000 ntdll!LdrInitializeThunk+0x20 [D:\xpclient\base\ntdll\daytona\..\ia64\ldrthunk.s @ 80]
00000000`0043f550 00000000`00440000 00000000`7de05690 ntdll!KiUserApcDispatch+0x50 [D:\xpclient\base\ntos\rtl\user\..\ia64\trampoln.s @ 203]
00000000`0043fff0 00000000`00440000 00000000`00000000 kernel32!MulDiv+0x110 [D:\xpclient\base\win32\client\i386\critsect.asm @ 550]

. 13  Id: f0f0f0f0.494 Suspend: 1 Teb: 00000000`7ef98000 Unfrozen
      Priority: 0
Child-SP          Child-BSP         RetAddr           Call Site
00000000`00feffe0 00000000`00ff0040 00000000`77e94f30 ntdll!DbgBreakPoint+0x10 [D:\xpclient\base\ntos\rtl\user\..\ia64\debugstb.s @ 66]
00000000`00feffe0 00000000`00ff0040 00000000`00000000 ntdll!DbgUiRemoteBreakin+0x90 [d:\xpclient\base\ntdll\dlluistb.c @ 269]

Total threads: 14
Duplicate callstacks: 11 (windbg thread #s follow):
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12

附加信息

关于堆栈回溯的更多信息和其它显示调用堆栈的方法,查看查看调用堆栈

!vadump

!vadump 扩展命令显示所有的虚拟内存区域以及它们对应的保护信息。

语法

!vadump [-v

参数

-v

显示中还包含每个原始分配区域(original allocation region)的信息。由于每个区域中的不同地址在分配之后可能改变成了自己的保护属性(例如使用VirtualProtect),所以大区域的原始保护属性可能和内部的子区域不一样。

DLL

Windows NT 4.0

Uext.dll

Windows 2000

Uext.dll

Windows XP和之后

Uext.dll

注释

下面是示例:

0:000> !vadump
BaseAddress:       00000000
RegionSize:        00010000
State:             00010000  MEM_FREE
Protect:           00000001  PAGE_NOACCESS

BaseAddress:       00010000
RegionSize:        00001000
State:             00001000  MEM_COMMIT
Protect:           00000004  PAGE_READWRITE
Type:              00020000  MEM_PRIVATE
.........

输出重,State 行显示从BaseAddress 开始的内存范围的状态。可能的状态值有MEM_COMMIT、MEM_FREE和MEM_RESERVE。

Protect 行显示内存区域的保护状态。可能的值有PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和PAGE_GUARD。

Type 行显示内存种类。可能的值有MEM_IMAGE、MEM_MAPPED和MEM_PRIVATE。

下面是使用-v参数的示例:

0:000> !vadump -v
BaseAddress:       00000000
AllocationBase:    00000000
RegionSize:        00010000
State:             00010000  MEM_FREE
Protect:           00000001  PAGE_NOACCESS

BaseAddress:       00010000
AllocationBase:    00010000
AllocationProtect: 00000004  PAGE_READWRITE
RegionSize:        00001000
State:             00001000  MEM_COMMIT
Protect:           00000004  PAGE_READWRITE
Type:              00020000  MEM_PRIVATE
.........

使用-v时,AllocationProtect行显示整个区域被创建时的默认保护属性。Protect行显示指定地址处实际的保护属性。

附加信息

要查看单个虚拟地址的内存保护信息,可以使用!vprot。关于内存保护的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!vprot

!vprot 扩展命令显示虚拟内存保护信息。

语法

!vprot [Address

参数

Address

指定要查看内存保护状态的16进制地址。

DLL

Windows NT 4.0

Uext.dll

Windows 2000

Uext.dll
Ntsdexts.dll

Windows XP和之后

Uext.dll

注释

!vprot 扩展命令可以用于活动调试和dump文件调试。

下面是示例:

0:000> !vprot 30c191c
BaseAddress: 030c1000
AllocationBase: 030c0000
AllocationProtect: 00000080 PAGE_EXECUTE_WRITECOPY
RegionSize: 00011000
State: 00001000 MEM_COMMIT
Protect: 00000010 PAGE_EXECUTE
Type: 01000000 MEM_IMAGE

输出中, AllocationProtect 行显示整个区域被创建时设置的默认保护属性。注意该区域中各个单独的地址可能在之后更改了保护属性(例如调用了VirtualProtect)。Protect行显示指定地址处实际的保护属性。保护属性的值有PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、 PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和 PAGE_GUARD。

State行对应传递给 !vprot 的虚拟地址。可能的状态有MEM_COMMIT、MEM_FREE、和MEM_RESERVE。

Type行显示内存类型。可能的值有MEM_IMAGE、MEM_MAPPED和 MEM_PRIVATE。

附加信息

要查看目标进程拥有的所有内存区域的保护信息,可以使用!vadump。关于内存保护的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

August 12

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)

August 11

WinDbg 文档翻译----89

cc682/NetRoc

http://netroc682.spaces.live.com/

!vm

!vm扩展命令显示目标系统中虚拟内存使用统计的摘要信息。

语法

Windows NT 4.0的语法

!vm 

Windows 2000和之后的语法

!vm [Flags

参数

Flags

(Windows 2000和之后) 指定命令输出中要显示哪些信息。可以是下面这些位的任意的和。默认值是0,会显示系统范围的内存使用统计,以及每个进程的内存统计。

Bit 0 (0x1)

不显示进程相关的统计。

Bit 1 (0x2)

显示内存管理线程的调用堆栈。

Bit 2 (0x4)

(Windows XP和之后) 显示终端服务器(terminal server)的内存使用情况。

Bit 3 (0x8)

(Windows XP和之后) 显示页面文件写日志(page file write log)。

Bit 4 (0x10)

(Windows XP和之后) 显示工作集所有者线程的调用堆栈(working set owner thread stacks)。

Bit 5 (0x20)

(Windows XP和之后) 显示内核的虚拟内存使用情况。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之后