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 Session] 0 Flags ImageName
Windows XP和之后的语法:
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
参数
/s Session
(Windows 2000和之后) 指定拥有给定进程的会话(session)。
/m Module
(Windows XP和之后) 指定拥有需要的进程的模块。
Process
指定目标机上某个进程的16进制地址或者进程ID。
Process 的值决定了!process 命令显示的是进程地址还是进程ID。如果在Windows NT 4.0中Process 为-1 ,或在其他任何系统中省略掉,调试器只显示当前系统进程的数据。如果Process 为0 并且省略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。