Freigeben über


.process (Set Process Context)

Der Befehl .process gibt an, welcher Prozess für den Prozesskontext verwendet wird.

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

Parameter

/Ich
Nur Livedebugging; nicht während des lokalen Kerneldebuggings) Gibt an, dass der Prozess invasiv gedebuggt werden soll. Diese Art des Debuggens bedeutet, dass das Betriebssystem des Zielcomputers den angegebenen Prozess tatsächlich aktiviert. (Ohne diese Option ändert der Befehl .process die Ausgabe des Debuggers, wirkt sich jedoch nicht auf den Zielcomputer selbst aus.) Wenn Sie /i verwenden, müssen Sie den Befehl g (Go) zum Ausführen des Ziels verwenden. Nach mehreren Sekunden wechselt das Ziel wieder in den Debugger, und der angegebene Prozess ist aktiv und wird für den Prozesskontext verwendet.

/p
Übersetzt alle Übergangsseitentabelleneinträge (PTEs) für diesen Prozess in physische Adressen vor dem Zugriff, wenn Sie /p verwenden und Process ungleich null ist. Diese Übersetzung kann zu Verlangsamungen führen, da der Debugger die physischen Adressen für den gesamten von diesem Prozess verwendeten Arbeitsspeicher finden muss. Außerdem muss der Debugger möglicherweise eine erhebliche Menge an Daten über das Debugkabel übertragen. (Dieses Verhalten ist dasselbe wie das von .cache forcedecodeuser.)

Wenn Sie die Option /p einbeziehen und Process " null ist oder Sie es weglassen, ist die Übersetzung deaktiviert. (Dieses Verhalten ist dasselbe wie das von .cache noforcedecodeptes.)

/r
Lädt Symbole für den Benutzermodus neu, nachdem der Prozesskontext festgelegt wurde, wenn Sie die Optionen /r und /p verwenden. (Dieses Verhalten ist dasselbe wie das von .reload /user.)

/P
(Nur Livedebugging und vollständige Speicherabbilder) Übersetzt alle Einträge der Übergangsseitentabelle (PTEs) in physische Adressen vor dem Zugriff, wenn Sie /P verwenden und Process ungleich null ist. Im Gegensatz zur Option /p übersetzt die Option /P die PTEs für alle Benutzermodus- und Kernelmodusprozesse, nicht nur für den angegebenen Prozess. Diese Übersetzung kann zu Verlangsamungen führen, da der Debugger die physischen Adressen für den gesamten verwendeten Arbeitsspeicher finden muss. Außerdem muss der Debugger möglicherweise viele Daten über das Debugkabel übertragen. (Dieses Verhalten ist dasselbe wie das von .cache forcedecodeptes.)

Prozess
Gibt die Adresse des gewünschten Prozesses an. (Genauer gesagt gibt dieser Parameter die Adresse des EPROCESS-Blocks für diesen Prozess an). Der Prozesskontext wird auf diesen Prozess festgelegt. Wenn Sie Process auslassen oder null angeben, wird der Prozesskontext auf den Standardprozess für den aktuellen Systemzustand zurückgesetzt. (Wenn Sie die Option /i zum Festlegen des Prozesskontexts verwendet haben, müssen Sie die Option /i zum Zurücksetzen des Prozesskontexts verwenden.)

Environment

Element Beschreibung
Modi Nur Kernelmodus
Ziele live, Crash Dump
Plattformen Alle

Zusätzliche Informationen

Weitere Informationen zum Prozesskontext und zu anderen Kontexteinstellungen finden Sie unter Ändern von Kontexten.

Hinweise

Wenn Sie den Kernel debuggen, ist der einzige sichtbare Adressraum im Benutzermodus derjenige, der mit dem aktuellen Prozess verbunden ist.

Der Befehl .process weist den Kerneldebugger an, einen bestimmten Benutzermodusprozess als Prozesskontext zu verwenden. Diese Verwendung hat mehrere Auswirkungen, aber am wichtigsten ist, dass der Debugger Zugriff auf den virtuellen Adressraum dieses Prozesses hat. Der Debugger verwendet die Seitentabellen für diesen Prozess, um alle Speicheradressen im Benutzermodus zu interpretieren, sodass Sie diesen Speicher lesen und in den Speicher schreiben können.

Der Befehl .context (Set User-Mode Address Context) hat einen ähnlichen Effekt. Allerdings setzt der Befehl .context den Adresskontext im Benutzermodus auf ein bestimmtes Seitenverzeichnis, während der Befehl .process den Prozesskontext auf einen bestimmten Prozess setzt. Auf einem x86-basierten Prozessor haben .context und .process nahezu den gleichen Effekt. Bei einem Itanium-basierten Prozessor kann ein einzelner Prozess jedoch mehrere Seitenverzeichnisse aufweisen. In diesem Fall ist der Befehl .process leistungsstärker, da er den Zugriff auf alle Seitenverzeichnisse ermöglicht, die einem Prozess zugeordnet sind. Weitere Informationen zum Prozesskontext finden Sie unter Prozesskontext.

Hinweis Wenn Sie ein Livedebugging ausführen, sollten Sie den Parameter /i oder /p verwenden. Ohne einen dieser Parameter können Sie den Benutzermodus oder den Sitzungsspeicher nicht ordnungsgemäß anzeigen.

Der Parameter /i aktiviert den Zielprozess. Wenn Sie diese Option verwenden, müssen Sie das Ziel einmal ausführen, damit dieser Befehl wirksam wird. Bei einer erneuten Ausführung geht der Prozesskontext verloren.

Der Parameter /p aktiviert die Einstellung forcedecodeuser. (Sie müssen /p nicht verwenden, wenn die Option forcedecodeuser bereits aktiv ist.) Der Prozesskontext und der Status forcedecodeuser bleiben nur bestehen, bis das Ziel erneut ausgeführt wird.

Wenn Sie einen Crash-Dump debuggen, sind die Optionen /i und /p nicht verfügbar. Sie können jedoch nicht auf Teile des virtuellen Adressraums des Benutzermodusprozesses zugreifen, der zum Zeitpunkt des Absturzes auf den Datenträger ausgelagert wurde.

Wenn Sie den Kerneldebugger verwenden möchten, um Haltepunkte im Benutzerbereich festzulegen, verwenden Sie die Option /i, um das Ziel in den richtigen Prozesskontext zu versetzen.

Das folgende Beispiel zeigt, wie Sie die Erweiterung !process verwenden, um die Adresse des EPROCESS-Blocks für den gewünschten Prozess zu finden.

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

Im Beispiel wird nun der Befehl .process mit dieser Prozessadresse verwendet.

kd> .process fe3c0d60
Implicit process is now fe3c0d60

Beachten Sie, dass dieser Befehl den Befehl .context überflüssig macht. Der Adresskontext des Benutzermodus weist bereits den gewünschten Wert auf.

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

Mit diesem Wert können Sie den Adressraum auf verschiedene Arten untersuchen. Das folgende Beispiel zeigt beispielsweise die Ausgabe der Erweiterung !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