NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----84

cc682/NetRoc

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

!poolfind

!poolfind 扩展命令在非分页和分页内存中查找指定的pool tag。

语法

Windows NT 4.0中的语法

!poolfind TagString [PoolType

Windows 2000和之后

!poolfind TagString [PoolType
!poolfind TagValue [PoolType

参数

TagString

指定pool tag。TagString 是区分大小写的ASCII字符串。星号(*)可以用来表示任意数量的字符,问号 (?)可以用来代表一个字符。如果没有使用星号, TagString 必须刚好是4个字符长度。

TagValue

(Windows 2000和之后) 指定pool tag。TagValue 必须以"0x"开头,即使默认的基数为16。如果该参数以任何其他值开头(包括"0X"),则会被解释为ASCII的标签字符串。

PoolType

指定要搜索的池类型。允许下面这些值:

0

指定非分页内存池。这是默认值。

1

指定分页内存池。

2

指定特殊池(special pool)。

4

(Windows XP和之后) 指定会话池(session pool)。

4, 5, 6

(仅Windows NT 4.0) 和0、1、2一样,但是显示详细信息。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

该命令根据需要搜索的池内存大小的不同,需要很长时间来执行。要加快速度,可以通过CTRL+A (Toggle Baud Rate) 键增加COM端口,或者使用.cache (Set Cache Size) 命令增加缓存大小 (设置到大约10 MB)。

Pool tag和传递给ExAllocateXxx 类例程的标签一样。

下面是一个示例。搜索整个非分页内存池之后搜索分页池,但是命令在完成之前被终止(长时间操作之后):

kd> !poolfind SeSd 0

Scanning large pool allocation table for Tag: SeSd (827d1000 : 827e9000)

Searching NonPaged pool (823b1000 : 82800000) for Tag: SeSd

826fa130 size:   c0 previous size:   40  (Allocated) SeSd
82712000 size:   c0 previous size:    0  (Allocated) SeSd
82715940 size:   a0 previous size:   60  (Allocated) SeSd
8271da30 size:   c0 previous size:   10  (Allocated) SeSd
82721c00 size:   10 previous size:   30  (Free)      SeSd
8272b3f0 size:   60 previous size:   30  (Allocated) SeSd
8272d770 size:   60 previous size:   40  (Allocated) SeSd
8272d7d0 size:   a0 previous size:   60  (Allocated) SeSd
8272d960 size:   a0 previous size:   70  (Allocated) SeSd
82736f30 size:   a0 previous size:   10  (Allocated) SeSd
82763840 size:   a0 previous size:   10  (Allocated) SeSd
8278b730 size:  100 previous size:  290  (Allocated) SeSd
8278b830 size:   10 previous size:  100  (Free)      SeSd
82790130 size:   a0 previous size:   20  (Allocated) SeSd
82799180 size:   a0 previous size:   10  (Allocated) SeSd
827c00e0 size:   a0 previous size:   30  (Allocated) SeSd
827c8320 size:   a0 previous size:   60  (Allocated) SeSd
827ca180 size:   a0 previous size:   50  (Allocated) SeSd
827ec140 size:   a0 previous size:   10  (Allocated) SeSd

Searching NonPaged pool (fe7c3000 : ffbe0000) for Tag: SeSd

kd> !poolfind SeSd 1

Scanning large pool allocation table for Tag: SeSd (827d1000 : 827e9000)

Searching Paged pool (e1000000 : e4400000) for Tag: SeSd

e10000b0 size:   d0 previous size:   20  (Allocated) SeSd
e1000260 size:   d0 previous size:   60  (Allocated) SeSd
......
e1221dc0 size:   a0 previous size:   60  (Allocated) SeSd
e1224250 size:   a0 previous size:   30  (Allocated) SeSd

...terminating - searched pool to e1224000
kd> 

附加信息

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

!poolused

!poolused 扩展用于根据每个内存池分配的标签(tag)的使用来显示内存使用摘要。

语法

Windows NT 4.0的语法:

!poolused [Flags

Windows 2000和之后的语法:

!poolused [Flags [TagString]] 

参数

Flags

指定要显示的内容和输出排序的方式。可以是下面这些位值的任意组合,但是bit 1 (0x2) 和 2 (0x4)不能一起使用。默认值为0,仅输出摘要信息,以pool tag排序。

Bit 0 (0x1)

显示详细信息。

Bit 1 (0x2)

以非分页内存使用的总数来排序。

Bit 2 (0x4)

以使用分页内存的总数来排序。

Bit 3 (0x8)

(Windows Server 2003和之后) 显示session pool而不是standard pool。

TagString

(Windows 2000和之后) 指定pool tag。TagString是区分大小写的ASCII字符串。星号 (*) 可用来代表任意数量的字符,问号 (?) 可以用来代表一个字符。如果没有使用星号,TagString 必须刚好是4个字符的长度。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

!poolused 扩展利用Windows的内存池标签(Pool tagging)功能来搜集数据。Pool tagging在Windows Server 2003和之后版本的Windows中一直是起用的。在Windows XP和之前版本中必须使用Gflags来启用。

如果在该扩展命令执行完成前停止它,调试器中会显示出部分结果。

该命令会显示每种标签的paged pool和nonpaged pool内存使用。两种情况下,显示中都包含当前使用给定tag分配的次数,以及分配的这些存储单元使用的字节数量。

下面是命令输出的一部分的示例:

0: kd> !poolused
   Sorting by  Tag

  Pool Used:
            NonPaged            Paged
 Tag    Allocs     Used    Allocs     Used
 1394        1      520         0        0UNKNOWN pooltag '1394', please update pooltag.txt
 1MEM        1     3368         0        0UNKNOWN pooltag '1MEM', please update pooltag.txt
 2MEM        1     3944         0        0UNKNOWN pooltag '2MEM', please update pooltag.txt
 3MEM        3      248         0        0UNKNOWN pooltag '3MEM', please update pooltag.txt
 8042        4     3944         0        0PS/2 kb and mouse , Binary: i8042prt.sys
 AGP         1      344         2      384UNKNOWN pooltag 'AGP ', please update pooltag.txt
 AcdN        2     1072         0        0TDI AcdObjectInfoG 
 AcpA        3      192         1      504ACPI Pooltags , Binary: acpi.sys
 AcpB        0        0         4      576ACPI Pooltags , Binary: acpi.sys
 AcpD       40    13280         0        0ACPI Pooltags , Binary: acpi.sys
 AcpF        6      240         0        0ACPI Pooltags , Binary: acpi.sys
 AcpM        0        0         1      128ACPI Pooltags , Binary: acpi.sys
 AcpO        4      208         0        0ACPI Pooltags , Binary: acpi.sys

...

 WmiG       30     6960         0        0Allocation of WMIGUID 
 WmiR       63     4032         0        0Wmi Registration info blocks 
 Wmip      146     3504       182    18600Wmi General purpose allocation 
 Wmit        1     4096         7    49480Wmi Trace 
 Wrpa        2      720         0        0WAN_ADAPTER_TAG 
 Wrpc        1       72         0        0WAN_CONN_TAG 
 Wrpi        1      120         0        0WAN_INTERFACE_TAG 
 Wrps        2      128         0        0WAN_STRING_TAG 
 aEoP        1      672         0        0UNKNOWN pooltag 'aEoP', please update pooltag.txt
 fEoP        1       16         0        0UNKNOWN pooltag 'fEoP', please update pooltag.txt
 hSVD        0        0         1       40Shared Heap Tag , Binary: mrxdav.sys
 hibr        0        0         1    24576UNKNOWN pooltag 'hibr', please update pooltag.txt
 iEoP        1       24         0        0UNKNOWN pooltag 'iEoP', please update pooltag.txt
 idle        2      208         0        0Power Manager idle handler 
 jEoP        1       24         0        0UNKNOWN pooltag 'jEoP', please update pooltag.txt
 mEoP        1       88         0        0UNKNOWN pooltag 'mEoP', please update pooltag.txt
 ohci        1      136         0        01394 OHCI host controller driver 
 rx..       3     1248         0        0UNKNOWN pooltag '  rx', please update pooltag.txt
 sidg        2       48         0        0GDI spooler events 
 thdd        0        0         1    20480DirectDraw/3D handle manager table 
 usbp       18    77056         2       96UNKNOWN pooltag 'usbp', please update pooltag.txt
 vPrt        0        0        18    68160UNKNOWN pooltag 'vPrt', please update pooltag.txt
 TOTAL     3570214 209120008     38769 13066104

附加信息

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

!poolval

!poolval 扩展命令分析pool page 的头部并诊断任何可能的错误。该命令仅在Windows XP和之后版本中可用。

语法

!poolval Address [DisplayLevel

参数

Address

指定要分析头部的pool的地址。

DisplayLevel

指定输出中要包含的信息。可以是任意的下面这些值(默认为0):

0

显示基本信息。

1

显示基本信息和头部链表(linked header lists)。

2

显示基本信息、头部链表和基本的头信息。

3

显示基本信息、头部链表,以及完整的头信息。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Kdexts.dll

附加信息

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

!popolicy

!popolicy 扩展显示目标机的电源策略。

语法

!popolicy [Address]

参数

Address

指定要显示的电源策略结构的地址。如果省略,则显示nt!PopPolicy。

DLL

Windows NT 4.0

不可用

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

下面是命令输出的示例:

kd> !popolicy
SYSTEM_POWER_POLICY (R.1) @ 0x80164d58
  PowerButton:      Shutdown  Flags: 00000003   Event: 00000000   Query UI
  SleepButton:          None  Flags: 00000003   Event: 00000000   Query UI
  LidClose:             None  Flags: 00000001   Event: 00000000   Query
  Idle:                 None  Flags: 00000001   Event: 00000000   Query
  OverThrottled:        None  Flags: c0000004   Event: 00000000   Override NoWakes Critical
  IdleTimeout:             0  IdleSensitivity:        50%
  MinSleep:               S0  MaxSleep:               S0
  LidOpenWake:            S0  FastSleep:              S0
  WinLogonFlags:           1  S4Timeout:               0
  VideoTimeout:            0  VideoDim:               209
  SpinTimeout:             0  OptForPower:             1
  FanTolerance:            0% ForcedThrottle:          0%
  MinThrottle:             0%

附加信息

使用!pocaps 扩展命令查看系统的电源能力(power cababilities)。关于电源能力和电源策略(power policy)的信息,查看Windows Driver Kit (WDK)文档,以及Mark Russinovich and David Solomon 编写的Microsoft Windows Internals

!prcb

!prcb 扩展命令显示处理器控制块(processor control block (PRCB))。

语法

!prcb [Processor

参数

Processor

指定要获得PRCB信息的处理器。如果省略Processor,则使用处理器0。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Kdexts.dll

注释

PRCB是处理器控制域(PCR)的一个扩展。使用!pcr 命令来显示PCR。

下面是示例:

kd> !prcb
PRCB for Processor 0 at e0000000818ba000:
Threads--  Current e0000000818bbe10 Next 0000000000000000 Idle e0000000818bbe10
Number 0 SetMember 00000001
Interrupt Count -- 0000b81f
Times -- Dpc    00000028 Interrupt 000003ff 
         Kernel 00005ef4 User      00000385 

附加信息

关于PCR和PRCB的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!process

!process 扩展显示指定的进程或所有进程的信息,包括EPROCESS块在内。

该命令只能在内核模式调试时使用。

语法

Windows NT 4.0的语法:

!process [Process [Flags]] 

Windows 2000的语法:

!process [/s Session] [Process [Flags]] 
!process [/s Session0 Flags ImageName 

Windows XP和之后的语法:

!process [/s Session] [/Module] [Process [Flags]] 
!process [/s Session] [/Module0 Flags ImageName 

参数

/s Session

(Windows 2000和之后) 指定拥有给定进程的会话(session)。

/m Module

(Windows XP和之后) 指定拥有需要的进程的模块。

Process

指定目标机上某个进程的16进制地址或者进程ID。

Process 的值决定了!process 命令显示的是进程地址还是进程ID。如果在Windows NT 4.0中Process-1 ,或在其他任何系统中省略掉,调试器只显示当前系统进程的数据。如果Process0 并且省略ImageName,调试器显示所有活动进程的信息。

Flags

指定显示内容的级别。Flags 可以是下面这些位的任意组合。如果Flags为0,只会显示很少的信息。默认值根据Windows版本和Process的值会有所不同。在Windows NT 4.0中,当Process被省略或者设置为0时默认为0x3,否则默认值为0xF。在Windows 2000中,当Process省略,或者Process为0并且省略ImageFile时,默认值是0x3;否则默认值为0xF。在Windows XP和之后,当Process省略或者为0或-1时,默认值为0x3,否则为0xF。

Bit 0 (0x1)

显示时间和优先级统计。

Bit 1 (0x2)

显示该进程关联的线程和事件列表,以及它们的等待状态。

Bit 2 (0x4)

显示进程关联的线程列表。如果没有同时指定Bit 1(0x2),则每个线程显示在单独一行上。如果同时指定了Bit 1,则每个线程还会显示堆栈回溯。

Bit 3 (0x8)

(Windows XP和之后) 显示每个函数的返回地址、堆栈指针,以及(在Itanium系统上)bsp寄存器的值。不显示函数的参数。

Bit 4 (0x10)

(Windows XP和之后) 在命令执行期间将进程上下文设定为指定的进程。这样会使得线程调用堆栈显示更加精确。因为该标志相当于对这个进程使用了.process /p /r,会丢弃(discard)任何存在的用户模式模块列表。当Process 为0时,调试器显示所有进程,并且显示每一个时都会切换进程上下文。如果只显示单个进程,并且它的用户模式状态已经被刷新(例如,使用了.process /p /r),那么就不需要使用这个标志。该标志仅在使用了 Bit 0(0x1)的时候起效。

ImageName

(Windows 2000和之后) 指定要显示的进程的名字。调试器会显示所有可执行映像名和ImageName 匹配的进程。映像名必须匹配EPROCESS 块中的那个。一般来说,这是启动了该进程的可执行文件的名字,包含扩展名(一般是.exe),并且第15个字符之后的字符被裁减掉。不能指定包含空格的映像名。指定了ImageName 时,Process 必须为0。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP和之后

Kdexts.dll

注释

下面是!process 0 0的显示的示例:

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 80a02a60  Cid: 0002    Peb: 00000000  ParentCid: 0000
    DirBase: 00006e05  ObjectTable: 80a03788  TableSize: 150.
    Image: System
PROCESS 80986f40  Cid: 0012    Peb: 7ffde000  ParentCid: 0002
    DirBase: 000bd605  ObjectTable: 8098fce8  TableSize:  38.
    Image: smss.exe
PROCESS 80958020  Cid: 001a    Peb: 7ffde000  ParentCid: 0012
    DirBase: 0008b205  ObjectTable: 809782a8  TableSize: 150.
    Image: csrss.exe
PROCESS 80955040  Cid: 0020    Peb: 7ffde000  ParentCid: 0012
    DirBase: 00112005  ObjectTable: 80955ce8  TableSize:  54.
    Image: winlogon.exe
PROCESS 8094fce0  Cid: 0026    Peb: 7ffde000  ParentCid: 0020
    DirBase: 00055005  ObjectTable: 80950cc8  TableSize: 222.
    Image: services.exe
PROCESS 8094c020  Cid: 0029    Peb: 7ffde000  ParentCid: 0020
    DirBase: 000c4605  ObjectTable: 80990fe8  TableSize: 110.
    Image: lsass.exe
PROCESS 809258e0  Cid: 0044    Peb: 7ffde000  ParentCid: 0026
    DirBase: 001e5405  ObjectTable: 80925c68  TableSize:  70.
    Image: SPOOLSS.EXE

这个表格是!process 0 0输出中出现的各个部分的说明。

成员

含义

Process address

单词PROCESS 之后的8字符长度的16进制数字是EPROCESS块的地址。上面例子中最后一条的进程地址为0x809258E0。

Process ID (PID)

Cid 后的16进制数字。上面例子中最后一条的PID是0x44,或者10进制的68。

Process Environment Block (PEB)

Peb 后面的16进制数字是进程环境块的地址 。上面例中最后一条的PEB位于0x7FFDE000。

Parent process PID

ParentCid 后面的16进制数字是父进程的PID。上面例中最后一条的父进程PID为0x26,或者10进制的38。

Image

拥有该进程的模块名。上例中最后一条的所有者为spoolss.exe。第一条的所有者为操作系统本身。

Process object address

ObjectTable 后的16进制数字。上例最后一条中,进程对象(process object)地址为0x80925c68。

 

要显示某个进程的完整信息,可以将Flags设置为7。可以将Process 设置为进程地址、进程ID,或者将ImageName设置为可执行映像的名字来指定进程。例如:

kd> !process fb667a00 7
PROCESS fb667a00 Cid: 0002  Peb: 00000000 ParentCid: 0000
  DirBase: 00030000 ObjectTable: e1000f88 TableSize: 112.
  Image: System
  VadRoot fb666388 Clone 0 Private 4. Modified 9850. Locked 0.
  FB667BBC MutantState Signalled OwningThread 0
  Token               e10008f0
  ElapsedTime            15:06:36.0338
  UserTime             0:00:00.0000
  KernelTime            0:00:54.0818
  QuotaPoolUsage[PagedPool]     1480
Working Set Sizes (now,min,max) (3, 50, 345)
  PeakWorkingSetSize        118
  VirtualSize            1 Mb
  PeakVirtualSize          1 Mb
  PageFaultCount          992
  MemoryPriority          BACKGROUND
  BasePriority           8
  CommitCharge           8

    THREAD fb667780 Cid 2.1 Teb: 00000000 Win32Thread: 80144900 WAIT: (WrFreePage) KernelMode Non-Alertable
    80144fc0 SynchronizationEvent
    Not impersonating
    Owning Process fb667a00
    WaitTime (seconds)   32278
    Context Switch Count  787
    UserTime         0:00:00.0000
    KernelTime        0:00:21.0821
    Start Address Phase1Initialization (0x801aab44)
    Initial Sp fb26f000 Current Sp fb26ed00
    Priority 0 BasePriority 0 PriorityDecrement 0 DecrementCount 0

    ChildEBP RetAddr Args to Child
    fb26ed18 80118efc c0502000 804044b0 00000000 KiSwapThread+0xb5
    fb26ed3c 801289d9 80144fc0 00000008 00000000 KeWaitForSingleObject+0x1c2

注意输出中的进程对象的地址可以用于类似!handle这样的其他扩展命令,用于获得更多信息。

下面表格用于说明前面例子中的各个部分。

成员

含义

WAIT

这个头后面附加的注释说明了等待原因。使用命令dt nt!_KWAIT_REASON 可以显示所有等待原因的列表。

ElapsedTime

列出从进程创建以来经过了多长时间。显示是以Hours : Minutes : Seconds . Milliseconds格式的。

UserTime

显示进程在用户模式下执行的时间。如果UserTime 特别高,可能说明了这个进程正在消耗系统资源。显示格式和ElapsedTime 一样。

KernelTime

显示进程在内核模式下运行的时间。如果KernelTime 的值非常高,可能意味着该进程在消耗系统资源。显示格式和ElapsedTime一样。

Working Set sizes

显示进程当前的最小和最大工作集(working set)大小,以页面数为单位。如果工作集异常的大,说明进程可能存在内存泄露,或者消耗了很多系统资源。

QuotaPoolUsage entries

列出进程使用的分页和非分页内存池。对存在内存泄露的系统,查看所有进程额外的非分页内存使用可以知道哪个进程存在内存泄露。

Clone

指示进程是否是由POSIX 或Interix字系统创建的。

Private

指示进程当前使用到的私有(非共享)页面数量。包括物理内存中的和已经换出的内存。

除了进程信息之外,线程信息中还包含被线程锁定的资源列表。这个信息位于线程信息的第三行。上面例子中,线程锁定了一个位于80144fc0处的SynchronizationEvent 资源。通过将该地址和!kdext*.locks扩展命令显示的锁的列表对比,可以知道哪个进程拥有资源的排它锁(exclusive lock)。

!stacks 扩展给出每个线程的状态的简单摘要。它可以代替!process 用于对系统进行快速的查看,特别是调试像资源争用或者死锁这样的多线程问题时。

附加信息

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

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

评论

# re: WinDbg 文档翻译----84 2008-08-08 12:02 许凌毅

很实用的说,  回复  更多评论   

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜