!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 扩展,以快速了解系统,尤其是在调试多线程问题(如资源冲突或死锁)时。