!process
!process 扩展显示有关指定进程或所有进程的信息,包括 EPROCESS 块。
此扩展只能在内核模式调试期间使用。
语法
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
参数
/s **** Session
指定拥有所需进程的会话。
/m **** Module
指定拥有所需进程的模块。
过程
指定目标计算机上进程的十六进制地址或进程 ID。
Process 的值确定 !process 扩展是显示进程地址还是进程 ID。 如果 Process 在任何版本的 Windows 中省略,调试器仅显示有关当前系统进程的数据。 如果 Process 为 0 并且省略 ImageName,调试器将显示有关所有活动进程的信息。 如果为 Process 指定 -1,则显示有关当前进程的信息。
标记
指定显示的详细信息级别。 Flags 可以是以下位的任何组合。 如果 Flags 为 0,则仅显示最少的信息量。 默认值因 Windows 版本和 Process 的值而异。 如果省略 Process 或者 Process 为 0 或 -1,则默认值为 0x3;否则,默认值为 0xF。
位 0(0x1)
显示时间和优先级统计信息。
位 1(0x2)
显示与进程关联的线程和事件及其等待状态的列表。
位 2(0x4)
显示与进程关联的线程列表。 如果不包含位 1(0x2),则每个线程显示在一行上。 如果这与位 1 一起包含,则每个线程都显示一个堆栈跟踪。
位 3(0x8)
显示每个函数的返回地址和堆栈指针。禁止显示函数参数。
位 4 (0x10)
在此命令执行期间,将进程上下文设置为指定的进程。 这样可以更准确地显示线程堆栈。 由于此标志等效于对指定进程使用 .process /p /r,因此将丢弃任何现有的用户模式模块列表。 如果 Process 为零,调试器将显示所有进程,并且每个进程的进程上下文都会更改。 如果您只显示单个进程,并且它的用户模式状态已经刷新(例如,使用 .process /p /r),则无需使用此标志。 此标志仅在与位 0(0x1)一起使用时才有效。
ImageName
指定要显示的进程的名称。 调试器显示其可执行映像名称与 ImageName 匹配的所有进程。 映像名称必须与 EPROCESS 块中的映像名称匹配。 通常,这是为启动进程而调用的可执行文件名,包括文件扩展名(通常为 .exe),并在第十五个字符后截断。 无法指定包含空格的映像名称。 指定 ImageName 时,Process 必须为零。
DLL
Kdexts.dll
其他信息
有关内核模式下进程的信息,请参阅更改上下文。 有关分析进程和线程的详细信息,请参阅 Microsoft Windows 内部资料(作者:Mark Russinovich 和 David Solomon)。
注解
以下是 !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 一词后面的八位十六进制数字是 EPROCESS 块的地址。 在前面示例中的最后一个条目中,进程地址为 0x809258E0。 |
进程 ID(PID) |
Cid 一词后面的十六进制数字。 在前面示例中的最后一个条目中,PID 为 0x44 或十进制 68。 |
进程环境块(PEB) |
Peb 一词后面的十六进制数字是进程环境块的地址。 在前面示例中的最后一个条目中,PEB 位于地址 0x7FFDE000。 |
父进程 PID |
ParentCid 一词后面的十六进制数字是父进程的 PID。 在前面示例中的最后一个条目中,父进程 PID 是 0x26 或十进制 38。 |
映像 |
拥有此进程的模块的名称。 在前面示例中的最后一个条目中,所有者是 spoolss.exe。 在第一个条目中,所有者是操作系统本身。 |
进程对象地址 |
ObjectTable 一词后面的十六进制数字。 在前面示例中的最后一个条目中,进程对象的地址为 0x80925c68。 |
若要显示一个进程的完整详细信息,请将 Flags 设置为 7。 可以通过将 Process 设置为等于进程地址、将 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)的输入,以获取进一步的信息。
下表描述了上一示例中的一些元素。
元素 | 含义 |
---|---|
等待 | 此标题后面的括号注释给出了等待的原因。 命令 dt nt!_KWAIT_REASON 将显示所有等待原因的列表。 |
ElapsedTime |
列出自创建进程以来已经过的时间量。 以小时: 分钟: 秒: 毫秒为单位显示。 |
UserTime |
列出进程在用户模式下运行的时间。 如果 UserTime 的值异常高,则可能会识别出正在消耗系统资源的进程。 单位与 ElapsedTime 的单位相同。 |
KernelTime |
列出进程在内核模式下运行的时间。 如果 KernelTime 的值异常高,则可能会识别出正在消耗系统资源的进程。 单位与 ElapsedTime 的单位相同。 |
工作集大小 |
以页为单位列出进程的当前、最小和最大工作集大小。 异常大的工作集大小可能是进程正在泄漏内存或耗尽系统资源的迹象。 |
QuotaPoolUsage 条目 |
列出进程使用的分页池和非分页池。 在内存泄漏的系统上,在所有进程上查找过多的非分页池使用情况可以揭示哪个进程发生了内存泄漏。 |
克隆 |
指示进程是否由 POSIX 或 Interix 子系统创建。 |
专用 |
指示进程当前正在使用的专用(不可共享)页面的数量。 这包括换入内存和换出内存。 |
除了进程列表信息之外,线程信息还包含线程具有锁的资源的列表。 该信息列在线程标头之后的第三行输出中。 在此示例中,线程在一个资源上具有锁,即地址为 80144fc0 的 SynchronizationEvent。 通过将此地址与 !kdext*.locks 扩展显示的锁列表进行比较,可以确定哪些线程对资源具有排他锁。
!stacks 扩展简要概述了每个线程的状态。 这可以用来代替 !process 扩展,以快速了解系统,尤其是在调试多线程问题(如资源冲突或死锁)时。