NetRoc's Blog

N-Tech

 

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和之后

Kdexts.dll

注释

下面是当Flags 为1时的简短输出的示例:

kd> !vm 1

*** Virtual Memory Usage ***
      Physical Memory:     16270   (   65080 Kb)
      Page File: \??\E:\pagefile.sys
         Current:     98304Kb Free Space:     61044Kb
         Minimum:     98304Kb Maximum:       196608Kb
      Available Pages:      5543   (   22172 Kb)
      ResAvail Pages:       6759   (   27036 Kb)
      Locked IO Pages:       112   (     448 Kb)
      Free System PTEs:    45089   (  180356 Kb)
      Free NP PTEs:         5145   (   20580 Kb)
      Free Special NP:       336   (    1344 Kb)
      Modified Pages:        714   (    2856 Kb)
      NonPagedPool Usage:    877   (    3508 Kb)
      NonPagedPool Max:     6252   (   25008 Kb)
      PagedPool 0 Usage:     729   (    2916 Kb)
      PagedPool 1 Usage:     432   (    1728 Kb)
      PagedPool 2 Usage:     436   (    1744 Kb)
      PagedPool Usage:      1597   (    6388 Kb)
      PagedPool Maximum:   13312   (   53248 Kb)
      Shared Commit:        1097   (    4388 Kb)
      Special Pool:          229   (     916 Kb)
      Shared Process:       1956   (    7824 Kb)
      PagedPool Commit:     1597   (    6388 Kb)
      Driver Commit:         828   (    3312 Kb)
      Committed pages:     21949   (   87796 Kb)
      Commit limit:        36256   (  145024 Kb)

所有的内存使用都是以页面数和KB为单位。输出中最有用的信息如下:

参数

含义

physical memory

系统中总的物理内存。

available pages

系统中可用内存的页面数,包括虚拟和物理内存。

nonpaged pool usage

非分页池中分配的页面总数。非分页池是不会换出到页面文件中的内存,所以它必须一直占用物理内存。如果这个数字过大,通常表示系统中某个地方存在内存泄露。

 

附加信息

!memusage 扩展命令可以用来分析物理内存的使用。关于内存管理的更多信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!vpb

!vpb 扩展显示某个卷参数块(volume parameter block (VPB))。

语法

!vpb Address 

参数

Address

指定VPB的16进制地址。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

下面是一个例子。首先用!devnode 扩展显示设备树:

kd> !devnode 0 1
Dumping IopRootDeviceNode (= 0x80e203b8)
DevNode 0x80e203b8 for PDO 0x80e204f8
  InstancePath is "HTREE\ROOT\0"
  State = DeviceNodeStarted (0x308)
  Previous State = DeviceNodeEnumerateCompletion (0x30d)
  DevNode 0x80e56dc8 for PDO 0x80e56f18
    InstancePath is "Root\dmio\0000"
    ServiceName is "dmio"
    State = DeviceNodeStarted (0x308)
    Previous State = DeviceNodeEnumerateCompletion (0x30d)
  DevNode 0x80e56ae8 for PDO 0x80e56c38
    InstancePath is "Root\ftdisk\0000"
    ServiceName is "ftdisk"
    State = DeviceNodeStarted (0x308)
    Previous State = DeviceNodeEnumerateCompletion (0x30d)
    DevNode 0x80e152a0 for PDO 0x80e15cb8
      InstancePath is "STORAGE\Volume\1&30a96598&0&Signature5C34D70COffset7E00Length60170A00"
      ServiceName is "VolSnap"
      TargetDeviceNotify List - f 0xe1250938  b 0xe14b9198
      State = DeviceNodeStarted (0x308)
      Previous State = DeviceNodeEnumerateCompletion (0x30d)
    .....

列出的最后一个节点是一个volume。使用 !devobj 扩展查看它的物理设备对象(physical device object (PDO)):

kd> !devobj 80e15cb8
Device object (80e15cb8) is for:
 HarddiskVolume1 \Driver\Ftdisk DriverObject 80e4e248
Current Irp 00000000 RefCount 14 Type 00000007 Flags 00001050
Vpb 80e15c30 DevExt 80e15d70 DevObjExt 80e15e40 Dope 80e15bd8 DevNode 80e152a0 
ExtensionFlags (0000000000)  
AttachedDevice (Upper) 80e14c60 \Driver\VolSnap
Device queue is not busy.

列出的内容中包括VPB 地址。使用!vpb 扩展和这个地址:

kd> !vpb 80e15c30
Vpb at 0x80e15c30
Flags: 0x1 mounted 
DeviceObject: 0x80de5020
RealDevice:   0x80e15cb8
RefCount: 14
Volume Label:           MY-DISK-C

附加信息

关于VPB的信息,查看Windows Driver Kit (WDK) 文档以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!vpdd

!vpdd 扩展显示指定进程的物理地址、虚拟地址和内存内容。

语法

!vpdd Process VirtualAddress 
!vpdd PID VirtualAddress 

参数

Process

指定要显示内存的进程的地址。

PID

指定要显示内存的进程的PID(process ID)。

VirtualAddress

指定要查看的页面的虚拟地址。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

不可用

Windows XP和之后

不可用

注释

下面是一个示例。假设要查看cmd.exe进程保存在虚拟地址0x4AD00000处的内存内容。首先使用!process 来查看进程地址:

kd> !process 0 0
.......
PROCESS 810e0020  SessionId: 0  Cid: 04e4    Peb: 7ffdf000  ParentCid: 014c
    DirBase: 0268a000  ObjectTable: 810db008  TableSize:  22.
    Image: CMD.EXE

!vpdd 的首个参数可以使用进程地址(0x810E0020)或者PID(0x4E4)。第二个参数是要显示的虚拟地址:

kd> !vpdd  810e0020 4ad00000
00fcf000 4ad00000  00905a4d 00000003 00000004 0000ffff
00fcf010 4ad00010  000000b8 00000000 00000040 00000000
00fcf020 4ad00020  00000000 00000000 00000000 00000000
00fcf030 4ad00030  00000000 00000000 00000000 000000d0
00fcf040 4ad00040  0eba1f0e cd09b400 4c01b821 685421cd
00fcf050 4ad00050  70207369 72676f72 63206d61 6f6e6e61
00fcf060 4ad00060  65622074 6e757220 206e6920 20534f44
00fcf070 4ad00070  65646f6d 0a0d0d2e 00000024 00000000

输出中,第一列是物理地址,第二列是虚拟地址。每行中剩下的内容是该位置保存的内容,以DWORD的形式。

附加信息

相关主题,查看!vtop!ptov、以及将虚拟地址转换成物理地址。关于页表和页目录的信息,查看 Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!vtop

!vtop 扩展命令将虚拟地址转换成对应的物理地址,并且显示其他的页表和页目录信息。

语法

Windows 2000的语法

!vtop PFN VirtualAddress 

Windows XP和之后的语法

!vtop PFN VirtualAddress 
!vtop 0 VirtualAddress 

参数

DirBase

指定进程页目录的基址。每个进程都有自己的虚拟地址空间。使用!process扩展命令来查看进程的页目录基址。

PFN

指定进程页目录基址的页面帧序号(PFN)。

0

(Windows XP和之后)!vtop 使用当前的进程上下文进行地址转换。

VirtualAddress

指定要转换的页面的虚拟地址。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

要使用这个命令,首先应该用!process扩展来查看进程的页目录基址。页目录基址的页面帧序号(PFN)可以通过将它的地址最后三个16进制0数字去掉来获得(换句话说,就是右移12位)。

下面是一个示例:

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,那么它的PFN 为0x098FD。

kd> !vtop 98fd 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)

注意最后三个0是可选的(貌似原文有错漏Notice how the trailing three zeros are optional.)。!vtop扩展命令会显示页目录索引(page directory index (PDI))、页表索引(page table index (PTI))、输入的虚拟地址、物理页面开始位置的物理地址、以及页表项(PTE)的页面帧序号(PFN)。

如果要将虚拟地址0x0012F980 转换成物理地址,只需要简单的将最后三个16进制数字 (0x980)加到页面开始处的物理地址(0x09DE9000)上。得到的物理地址为0x09DE9980。

如果忘记去掉那三个0,并且将完整的页目录基址传递给了!vtop,而不是 使用PFN,那么结果通常都会是正确的。这是由于!vtop 接收到一个太大的PFN数字时,会将它右移16位后再使用:

kd> !vtop 98fd 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)

kd> !vtop 98fd000 12f980
Pdi 0 Pti 12f
0012f980 09de9000 pfn(09de9)

但是,最好还是使用PFN,因为有些页目录基址在这种情况下不会被转换。

附加信息

关于获得这些结果的其他方法,查看将虚拟地址转换成物理地址。还可以查看!ptov!vpdd。关于页表和页目录的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!walklist

!walklist 扩展命令在当前会话的会话链表中搜索某个地址。

语法

!walklist [-a] [-o OffsetStartAddress SearchAddress
!walklist -? 

参数

-a

搜索所有会话列表。

-o Offset

指定链表中next字段的偏移。

StartAddress

指定会话链表的起始地址。

SearchAddress

指定要在链表中搜索的地址。

-?

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

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Kdexts.dll

附加信息

关于会话的信息,查看改变上下文。关于内存池和pool tag的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!wdmaud

显示各种WDM Audio (WDMAud)结构。

语法

!wdmaud Address Flags 

参数

Address

指定要显示的结构地址。

Flags

指定要显示的信息。必须只包含bits 0x1、0x2、0x4和0x8中的一个。0x100 可以和它们中任何一个共同使用。

Bit 0 (0x1)

显示已经发送给wdmaud.sys过的IOCTL的列表。使用时,Address 需要指定WdmaIoctlHistoryListHead的地址。如果设置了0x100这个位,还会显示每个IOCTL发送的pContext

Bit 1 (0x2)

显示标记为pending的IRP列表。Address指定WdmaPendingIrpListHead的地址。如果设置了0x100这个位,还会显示每个IRP分配时的context。

Bit 2 (0x4)

显示WDMAud 分配的MDL列表。Address 指定WdmaAllocatedMdlListHead的地址。如果设置了0x100位,还显示每个MDL分配时的context。

Bit 3 (0x8)

显示附加到wdmaud.sys 上的所有活动context的列表。Address需要指定 WdmaContextListHead的地址。如果设置了0x100位,还会显示每个context结构中的数据成员。

Bit 8 (0x100)

显示详细信息。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之后

不可用

注释

附加到wdmaud.sys 的context(pContext)包含了每个device的大多数状态数据。每次wdmaud.drv 被加载进一个新的进程时,会通报wdmaud.sys。当wdmaud.drv 被卸载时, wdmaud.sys 会清理在这个context下分配的所有资源。

附加信息

关于WDM音频架构和音频驱动,查看Windows Driver Kit (WDK)文档。

!whattime

!whattime 扩展命令将tick count转换成标准的时间值。

语法

!whattime Ticks 

参数

Ticks

Tick的次数。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Kdexts.dll

注释

输出以HH:MM:SS.mmm的格式。下面是示例:

kd> !whattime 29857ae4
696613604 Ticks in Standard Time:  15:02:16.040s

!whatperftime

!whatperftime 扩展命令将高分辨率性能计数器值(high-resolution performance counter value)转换成标准的时间格式。

语法

!whatperftime Count 

参数

Count

performance counter clock的值。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Kdexts.dll

注释

可以用 !whatperftime 来转换通过调用QueryPerformanceCounter 获得的值。性能计数器时间值也能在软件跟踪(software trace)中看到。

输出按照HH:MM:SS.mmm格式,下面是示例:

kd> !whatperftime 304589
3163529 Performance Counter in Standard Time: .004.313s

!wsle

!wsle 扩展命令显示所有的工作集列表项(working set list entries (WSLEs))。

语法

Windows NT 4.0 和Windows 2000的语法

!wsle [DisplayMode [Address]] 

Windows XP和之后的语法

!wsle [Flags [Address]] 

参数

DisplayMode

(仅Windows NT 4.0 和Windows 2000) 指定显示中包含的信息。可以是下面这些值中的一个(默认值为0):

0

仅显示工作集列表的基本信息。

7

显示工作集列表的基本信息,以及WSLE地址的信息、存在时间、锁定状态,以及引用计数。如果WSLE具有关联的无效页表项(PTE)或者页目录项(PDE),也会一起显示。

8

显示工作集列表的基本信息,以及索引和每个WSLE的值。

Flags

(Windows XP和之后) 指定显示中包含的信息。可以是下面这些位的任意组合。默认为0。如果使用了这个标志,则只会显示基本的工作集信息。

Bit 0 (0x1)

显示中包括每个WSLE的地址、存在时间、加锁状态以及引用计数。如果WSLE具有关联的无效页表项(PTE)或者页目录项(PDE),也会一起显示。

Bit 1 (0x2)

显示有效WSLE(valid WSLE)的总数、最后一个WSLE的索引,以及第一个空闲WSLE(free WSLE)的索引。

Bit 2 (0x4)

显示空闲WSLE的总数,以及每个空闲WSLE的索引。如果还设置了bit 1,那么还会检查空闲WSLE个数和有效WSLE的个数加起来是否等于WSLE的总个数。

Address

指定工作集列表的地址。如果省略,则使用默认工作集列表。(在Windows NT 4.0 和Windows 2000中,Address指定-1和省略的效果一样。 在Windows XP和之后版本的Windows中,Address指定0和省略的效果一样。)

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

该扩展命令可能需要很长时间来执行。

下面是在一个运行Windows Server 2003系统的x86目标机上的示例:

kd> !wsle 3

Working Set @ c0503000
    FirstFree:       a7  FirstDynamic:          4
    LastEntry      23d  NextSlot:         4  LastInitialized      259
    NonDirect       65  HashTable:        0  HashTableSize:         0

Reading the WSLE data...

Virtual Address           Age  Locked  ReferenceCount
        c0300203          0        1        1
        c0301203          0        1        1
        c0502203          0        1        1
        c0503203          0        1        1
        c01ff201          0        0        1
        77f74d19          3        0        1
        7ffdfa01          2        0        1
        c0001201          0        0        1

.....

Reading the WSLE data...
Valid WSLE entries = 0xa7
found end @ wsle index 0x259

.....

附加信息

关于工作集的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!xpoolmap

(仅Windows XP)!xpoolmap 扩展命令显示内存池使用的map。

语法

!xpoolmap [Pool
!xpoolmap -? 

参数

Pool

指定分页或非分页池。使用0 或者10  代表非分页池。1代表分页池。默认值是0

-?

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

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Kdexts.dll

该扩展命令只能用于x86目标机。

注释

!xpoolmap 扩展仅在Windows XP上支持。在Windows 2000 和Windows NT 4.0上,使用 !kdex2x86.xpool –map。这个扩展命令是OEM支持扩展包(OEM Support Extensions package)的一部分。关于这个包的安装,查看OEM 支持扩展(kdex2x86.dll)

下面是一个部分的例子:

0: kd> !xpoolmap
unable to get nt!MmSubsectionTopPage
unable to get nt!MmNonPagedMustSucceed
.....................................................
Status Map of Pool Area Pages
==============================
'O': one page in use                              ('P': paged out)
'<': start page of contiguous pages in use        ('{': paged out)
'>': last page of contiguous pages in use         ('}': paged out)
'=': intermediate page of contiguous pages in use ('-': paged out)
'.': one page not used

Non-Paged Pool Area Summary
----------------------------
Maximum Number of Pages  = 52691 pages
Number of Pages In Use   = 52689 pages (100.0%)

          +00000  +08000   +10000  +18000   +20000  +28000   +30000  +38000
81653000: OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO
81693000: OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO
816d3000: OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO

...

86753000: OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO
86793000: OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO
867d3000: OOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOO OOOOOOOOOOOO<
f7fba000: .>OOOOOOOOO<==== >O<=><>OOOO<><>O O<=======>OOOO<= >OO<>OOOOOOOOOOO
f7ffa000: OOOO<=><><=><=== >OOOO<>OO<=><>OO OOO<><=>O<=====> <=>OOOOO<>O<==><
f803a000: >O<===><==>OOOOO OOOOOOOOOOOOO<=> OOOOO<=>O<==><>O OOO<>OO<=====><=
f807a000: ><>OOOOO<=>O<=>O <>OOOOOOOO<==>OO <>OOOOOOO<====>O <>OO<><>OOOOO<>O

...

ffafa000: >OOO<>OOOOOOOOOO OOO<==>OOO<>O<>O OO<=======>OOOOO O<===>OOOOOOOOOO
ffb3a000: O<>OO<>OOOOOOOOO O<==>OOOOO<>OO<> OO<=>O<=><>OOOO< >OOOOOOOOOOO<><>
ffb7a000: <==>OO<>OOOOO<=> OOOO<=>O<==><=== ====>OOOO<>OOOOO OOO<>O<>OOO<==><
ffbba000: =>OOO<=====>O<== >OOO<=><=>OOOO<= >OO<=.

!zombies

!zombies扩展命令显示所有僵死("僵尸")进程或线程。

语法

!zombies [Flags [RestartAddress]] 

参数

Flags

指定要显示的内容。可能的值如下:

1

显示所有僵尸进程。(这是默认值)

2

显示所有僵尸线程。

RestartAddress

指定搜索开始位置的16进制地址。当前一次搜索过早结束时有用。默认值为0。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之后

不可用

注释

僵尸进程是已经死亡但是还没有从进程列表中摘除的进程。僵尸线程也是类似这样。

该扩展命令仅在Windows 2000中可用。

附加信息

查看所有进程和线程的列表,使用!process扩展。.

关于内核模式下进程和线程的概要信息,查看改变上下文。关于分析进程和线程的信息,查看Mark Russinovich 和David Solomon编写的 Microsoft Windows Internals

posted on 2008-08-11 13:24 NetRoc 阅读(521) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜