次の方法で共有


.process (プロセス コンテキストの設定)

.process コマンドでは、プロセス コンテキストに使用するプロセスを指定します。

.process [/i] [/p [/r]] [/P] [Process]

パラメーター

/i
ライブ デバッグのみ (ローカル カーネル デバッグ中の指定は不可)。プロセス侵襲的にデバッグすることを指定します。 この種のデバッグは、ターゲット コンピューターのオペレーティング システムが、指定されたプロセスを実際に有効化することを意味します (このオプションを指定していない場合、.process コマンドによりデバッガーの出力が変更されますが、ターゲット コンピューター自体には影響しません)。/i を使用する場合は、g (Go) コマンドを使用してターゲットを実行する必要があります。 数秒後、ターゲットはデバッガーに戻り、指定された Process がアクティブ化され、プロセス コンテキストに使用されます。

/p
/p を使用していて、Process がゼロ以外の場合、このプロセスのすべての遷移ページ テーブル エントリ (PTE) は、アクセス前に物理アドレスに変換されます。 デバッガーはこのプロセスで使用されているすべてのメモリの物理アドレスを特定する必要があるため、この変換により速度が低下する可能性があります。 また、デバッガーでは、デバッグ ケーブルを介して大量のデータの転送が必要になる場合があります (この動作は、.cache forcedecodeuser と同じです)。

/p オプションを指定していて、Process がゼロの場合または省略した場合、変換は無効になります (この動作は、.cache noforcedecodeptes と同じです)。

/r
/r オプションおよび /p オプションを指定すると、プロセス コンテキストの設定後に、ユーザー モード シンボルの再読み込みが行われます (この動作は、.reload /user と同じです)。

/P
(ライブ・デバッグと完全なメモリ ダンプのみ) /P を指定していて、Process がゼロ以外の場合は、アクセス前にすべての遷移ページ テーブル エントリ (PTE) が物理アドレスに変換されます。 /p オプションの場合とは異なり、/P オプションを指定した場合は、指定したプロセスだけでなく、すべてのユーザー モードおよびカーネル モード プロセスの PTE が変換されます。 デバッガーは使用されているすべてのメモリの物理アドレスを特定する必要があるため、この変換により速度が低下する可能性があります。 また、デバッガーでは、デバッグ ケーブルを介して大量のデータの転送が必要になる場合があります (この動作は .cache forcedecodeptes と同じです)。

Process
必要なプロセスのアドレスを指定します (正確には、このパラメーターで、このプロセスの EPROCESS ブロックのアドレスを指定します)。 プロセス コンテキストがこのプロセスに設定されます。 Process を省略するかゼロを指定すると、プロセス コンテキストは現在のシステム状態に対応する既定プロセスにリセットされます (/i オプションを使用してプロセス コンテキストを設定した場合は、/i オプションを使用してプロセス コンテキストをリセットする必要があります)。

Environment

項目 説明
モード カーネル モードのみ
対象 ライブ、クラッシュ ダンプ
プラットフォーム すべて

追加情報

プロセス コンテキストおよびその他のコンテキスト設定の詳細については、「コンテキストの変更」を参照してください。

解説

通常、カーネル デバッグを行う場合、確認できるユーザー モード アドレス空間は、現在のプロセスに関連付けられているものだけです。

.process コマンドは、特定のユーザーモード プロセスをプロセス コンテキストとして使用するようにカーネル デバッガーに指示します。 この使用法には複数の効力がありますが、最も重要なものは、デバッガーがこのプロセスの仮想アドレス空間にアクセスできるという点です。 デバッガーがこのプロセスのページ テーブルを使用してすべてのユーザー モード メモリ アドレスを解釈するため、このメモリに対する読み取りと書き込みが可能になります。

.context (ユーザーモード アドレス コンテキストの設定) コマンドにも同様の効力があります。 ただし、.context コマンドではユーザー モード アドレス コンテキストを特定のページ ディレクトリに設定しますが、.process コマンドではプロセス コンテキストを特定のプロセスに設定します。 x86 ベースのプロセッサでは、.context.process の効力がほとんど同じになります。 ただし、Itanium ベースのプロセッサでは、1 つのプロセスに複数のページ ディレクトリが存在する場合があります。 この状況では、プロセスに関連付けられたすべてのページ ディレクトリへのアクセスが可能になるため、.process コマンドの方が強力です。 プロセス・コンテキストの詳細については、「プロセス コンテキスト」を参照してください。

メモ: ライブ デバッグを実行する場合は、/i パラメーターまたは /p パラメーターを使用する必要があります。 これらのパラメーターのいずれかを指定しないと、ユーザー モードまたはセッション メモリを正しく表示できません。

/i パラメーターを指定すると、ターゲット プロセスがアクティブ化されます。 このオプションを使用する場合、このコマンドを有効にするためにターゲットを一度実行する必要があります。 再度実行すると、プロセス コンテキストが失われます。

/p パラメーターを指定すると、forcedecodeuser 設定が有効になります (forcedecodeuser オプションが既にアクティブであれば、/p を使用する必要はありません)。プロセス コンテキストと forcedecodeuser の状態が維持されるのは、ターゲットが再度実行されるまでの間のみです。

クラッシュ ダンプのデバッグを実行する場合は、/i オプションと /p オプションを使用できません。 ただし、クラッシュの発生時にディスクにページングされたユーザー モード プロセスの仮想アドレス空間には、どの部分にもアクセスできません。

カーネル デバッガーを使用してユーザー空間にブレークポイントを設定する場合は、/i オプションを使用して、ターゲットを正しいプロセス コンテキストに切り替えます。

次の例は、!process 拡張機能を使用して、目的のプロセスの EPROCESS ブロックのアドレスを特定する方法を示しています。

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0  SessionId: 0  Cid: 0008    Peb: 00000000  ParentCid: 0000
    DirBase: 00030000  ObjectTable: fe529b68  TableSize:  50.
    Image: System

.....

PROCESS fe3c0d60  SessionId: 0  Cid: 0208    Peb: 7ffdf000  ParentCid: 00d4
    DirBase: 0011f000  ObjectTable: fe3d0f48  TableSize:  30.
    Image: regsvc.exe

次の例では、このプロセス アドレスを指定して .process コマンドを使用しています。

kd> .process fe3c0d60
Implicit process is now fe3c0d60

このコマンドを使用することで .context コマンドが不要になっています。 ユーザー モード アドレス コンテキストには、既に目的の値が設定されています。

kd> .context 
User-mode page directory base is 11f000

この値により、さまざまな方法でアドレス空間を調べることができます。 たとえば、次の例は、!peb 拡張機能の出力を示しています。

kd> !peb
PEB at 7FFDF000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            No
    ImageBaseAddress:         01000000
    Ldr.Initialized: Yes
    Ldr.InInitializationOrderModuleList: 71f40 . 77f68
    Ldr.InLoadOrderModuleList: 71ec0 . 77f58
    Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
        01000000 C:\WINNT\system32\regsvc.exe
        77F80000 C:\WINNT\System32\ntdll.dll
        77DB0000 C:\WINNT\system32\ADVAPI32.dll
        77E80000 C:\WINNT\system32\KERNEL32.DLL
        77D40000 C:\WINNT\system32\RPCRT4.DLL
        77BE0000 C:\WINNT\system32\secur32.dll
    SubSystemData:     0
    ProcessHeap:       70000
    ProcessParameters: 20000
        WindowTitle: "'C:\WINNT\system32\regsvc.exe'"
        ImageFile:    'C:\WINNT\system32\regsvc.exe'
        CommandLine:  'C:\WINNT\system32\regsvc.exe'
        DllPath:     'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
        Environment:  0x10000