!process

!process 拡張機能は、指定されたプロセスに関する情報、または EPROCESS ブロックを含むすべてのプロセスに関する情報を表示します。

この拡張機能は、カーネル モードのデバッグ中にのみ使用できます。

構文

!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName

パラメーター

/s **** Session
目的のプロセスを所有するセッションを指定します。

/m **** Module
目的のプロセスを所有するモジュールを指定します。

Process
ターゲット コンピューター上のプロセスの 16 進アドレスまたはプロセス ID を指定します。

!process 拡張機能で表示される値がプロセス アドレスかプロセス ID であるかは、Process の値によって決まります。 Windows のバージョンを問わず、Process を省略した場合は、現在のシステム プロセスに関するデータのみが表示されます。 Process の値が 0 で ImageName を省略した場合は、すべてのアクティブなプロセスに関する情報が表示されます。 Process に -1 を指定した場合は、現在のプロセスの情報が表示されます。

Flags
表示する詳細レベルを指定します。 Flags には、以下のビットの任意の組み合わせを指定できます。 Flags が 0 の場合、最小限の情報のみが表示されます。 既定値は、Windows のバージョンと Process の値によって異なります。 Process が省略された場合と、Process が 0 または -1 の場合の既定値は 0x3 です。それ以外の場合の既定値は 0xF です。

ビット 0 (0x1)
時間と優先度の統計情報を表示します。

ビット 1 (0x2)
プロセスに関連付けられているスレッドとイベントのリスト、およびこれらの待機状態を表示します。

ビット 2 (0x4)
プロセスに関連付けられているスレッドのリストを表示します。 ビット 1 (0x2) を含めずにこれを含めた場合は、各スレッドが 1 行で表示されます。 ビット 1 と共にこれを含めた場合は、各スレッドがスタック トレースと共に表示されます。

ビット 3 (0x8)
関数ごとのリターン アドレスとスタック ポインターを表示します。関数の引数は表示されません。

ビット 4 (0x10)
このコマンドの実行中、指定されたプロセスに等しいプロセス コンテキストを設定します。 これにより、スレッド スタックがより正確に表示されます。 このフラグの使用には、指定されたプロセスに対して .process /p /r を使用した場合と同じ効力があるため、既存のユーザー モード モジュール リストはすべて破棄されます。 Process がゼロの場合はすべてのプロセスが表示され、プロセスごとにプロセス コンテキストが変更されます。 表示対象が単一のプロセスのみであり、そのプロセスのユーザー モード状態が既に (.process /p /r を使用するなどにより) 更新されている場合、このフラグを使用する必要はありません。 このフラグは、ビット 0 (0x1) と共に使用した場合にのみ有効です。

ImageName
表示するプロセスの名前を指定します。 デバッガーは、実行可能イメージ名が ImageName と一致するすべてのプロセスを表示します。 イメージ名は EPROCESS ブロック内のものと一致する必要があります。 一般に、これは、プロセスを開始する際に呼び出された実行可能ファイルの名前であり、ファイル拡張子 (通常は .exe) が含まれ、15 番目より後の文字は切り捨てられます。 スペースを含むイメージ名を指定する方法はありません。 ImageName を指定する場合は、Process をゼロにする必要があります。

DLL

Kdexts.dll

追加情報

カーネル モードのプロセスについては、「コンテキストの変更」を参照してください。 プロセスとスレッドの分析の詳細については、『Microsoft Windows Internals』 (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 という語の後に表示される 8 文字の 16 進数は、EPROCESS ブロックのアドレスです。 上の例の最後のエントリでは、プロセス アドレスは 0x809258E0 です。

プロセス ID (PID)

Cid という語の後に表示される 16 進数。 上の例の最後のエントリでは、PID は 0x44、つまり 10 進数の 68 です。

プロセス環境ブロック (PEB)

Peb という語の後に表示される 16 進数は、プロセス環境ブロックのアドレスです。 上の例の最後のエントリの場合、PEB のアドレス位置は 0x7FFDE000 です。

親プロセスの PID

arentCid という語の後に表示される 16 進数は、親プロセスの PID です。 上の例の最後のエントリでは、親プロセスの PID は 0x26、つまり 10 進数の 38 です。

Image

プロセスを所有するモジュールの名前です。 上の例の最後のエントリでは、所有者は spoolss.exe です。 最初のエントリでは、所有者はオペレーティング システムです。

プロセス オブジェクト アドレス

ObjectTable という語の後に表示される 16 進数です。 上の例の最後のエントリでは、プロセス オブジェクトのアドレスは 0x80925c68 です。

1 つのプロセスの完全な詳細情報を表示するには、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 など、他の拡張機能への入力として使用できます。

次の表では、上の例に含まれる要素について説明しています。

要素 意味
WAIT この見出しの後の括弧内のコメントには、待機の理由が示されています。 コマンド dt nt!_KWAIT_REASON を実行すると、すべての待機理由のリストを表示できます。

ElapsedTime

プロセスが作成されてからの経過時間を表示します。 時:分:秒.ミリ秒の単位で表示されます。

UserTime

プロセスがユーザー モードで実行されている時間を表示します。 UserTime の値が異常に大きい場合は、プロセスによるシステム リソースの枯渇を示している可能性があります。 単位は ElapsedTime の場合と同じです。

KernelTime

プロセスがカーネル モードで実行されている時間を示します。 KernelTime の値が異常に大きい場合は、プロセスによるシステム リソースの枯渇を示している可能性があります。 単位は ElapsedTime の場合と同じです。

Working Set Sizes

プロセスの現在、最小、最大のワーキング セット サイズをページ数単位で示します。 ワーキング セット サイズが異常に大きい場合は、プロセスでのメモリ リークまたはシステム リソースの枯渇を示している可能性があります。

QuotaPoolUsage エントリ

プロセスによるページ プールと非ページ プールの使用量を示します。 メモリ リークが発生しているシステムでは、すべてのプロセスで過剰な非ページ プールの使用を調べると、どのプロセスでメモリ リークが発生しているかを知ることができます。

Clone

プロセスが POSIX サブシステムまたは Interix サブシステムによって作成されたかどうかを示します。

Private

プロセスによって現在使用されているプライベート (共有不可) ページの数を示します。 これには、ページイン メモリとページアウト メモリの両方が含まれます。

スレッド情報には、プロセス リスト情報に加えて、スレッドがロックしているリソースのリストが含まれます。 出力では、この情報はスレッド ヘッダーの後の 3 行目に表示されます。 この例では、スレッドは 1 つのリソース (アドレス 80144fc0 の SynchronizationEvent) をロックしています。 このアドレスと、!kdext*.locks 拡張機能で表示されるロックのリストを比較することで、どのスレッドがリソースを排他的にロックをしているかを判断できます。

!stacks 拡張機能は、すべてのスレッドの状態の簡単な概要を提供します。 これを !process 拡張子の代わりに使用すると、特にリソースの競合やデッドロックなどマルチスレッドの問題をデバッグする場合に、システムの概要を簡単に把握できます。