!process

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

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

構文

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

パラメータ

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

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

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

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

示す
表示する詳細レベルを指定します。 フラグ は、次のビットの任意の組み合わせにすることができます。 フラグ が0の場合は、最小限の情報だけが表示されます。 既定値は、Windows のバージョンと Process の値によって異なります。 プロセス が省略された場合、または process が0または-1 のいずれかである場合、既定値は0x3 です。それ以外の場合、既定値は0Xf ですです。

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

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

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

ビット 3 (0x8)
各関数の戻りアドレスとスタックポインターを表示します。関数の引数の表示は抑制されます。

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

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

DLL

Kdexts.dll

追加情報

カーネルモードのプロセスの詳細については、「 コンテキストの変更」を参照してください。 プロセスとスレッドの分析の詳細については、「 Microsoft Windows 内部」 (Mark Russinovich と David ソロモン) を参照してください。

解説

次に、 ! 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 出力の一部の要素について説明します。

要素 説明

プロセスアドレス

ワードプロセスの後の8桁の16進数値は、EPROCESS ブロックのアドレスです。 前の例の最後のエントリでは、プロセスアドレスは0x809258E0 です。

プロセス ID (PID)

"Cid" の後の16進数値。 前の例の最後のエントリでは、PID は0x44 または10進68です。

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

Peb の後の16進数は、プロセス環境ブロックのアドレスです。 前の例の最後のエントリでは、PEB はアドレス0x7FFDE000 にあります。

親プロセス PID

親プロセスの PID は、"ParentCid" の後の16進数です。 前の例の最後のエントリでは、親プロセス PID は0x26、または10進38です。

Image

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

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

Word ObjectTable の後の16進数値。 前の例の最後のエントリでは、プロセスオブジェクトのアドレスは0x80925c68 です。

1つのプロセスの完全な詳細を表示するには、 フラグ を7に設定します。 プロセスのアドレスと同じプロセス を設定する か、プロセス 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 の値が非常に高い場合は、システムリソースを depleting しているプロセスを特定できます。 単位は ElapsedTime の単位と同じです。

KernelTime

プロセスがカーネルモードで実行されていた時間を一覧表示します。 カーネル時間の値が非常に高い場合は、システムリソースを depleting しているプロセスを特定できます。 単位は ElapsedTime の単位と同じです。

ワーキングセットのサイズ

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

QuotaPoolUsage エントリ

プロセスで使用されるページプールと非ページ プールを一覧表示します。 メモリ リークが発生したシステムでは、すべてのプロセスで過剰な非ページ プールの使用を探して、メモリ リークが発生しているプロセスを確認できます。

複製

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

プライベート

プロセスで現在使用されているプライベート (非シャーブル) ページの数を示します。 これには、メモリのページインとページアウトの両方が含まれます。

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

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