!process
Die Erweiterung !process zeigt Informationen zum angegebenen Prozess oder zu allen Prozessen an, einschließlich des EPROCESS-Blocks.
Diese Erweiterung kann nur während dem Debugging im Kernelmodus verwendet werden.
Syntax
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
Parameter
/s **** Session
Gibt die Sitzung an, die den gewünschten Prozess besitzt.
/m **** Module
Gibt das Modul an, das den gewünschten Prozess besitzt.
Prozess
Gibt die Hexadezimaladresse oder die Prozess-ID des Prozesses auf dem Zielcomputer an.
Der Wert von Process bestimmt, ob die Erweiterung !process eine Prozessadresse oder eine Prozess-ID anzeigt. Wenn Process in einer beliebigen Windows-Version ausgelassen wird, zeigt der Debugger nur Daten zum aktuellen Systemprozess an. Wenn Process 0 ist und ImageName ausgelassen wird, zeigt der Debugger Informationen zu allen aktiven Prozessen an. Wenn -1 für Process angegeben ist, werden Informationen zum aktuellen Prozess angezeigt.
Flags
Gibt die Detailstufe an, die angezeigt werden soll. Flags können eine beliebige Kombination der folgenden Bits sein. Wenn Flags 0 sind, wird nur eine minimale Menge an Informationen angezeigt. Der Standardwert variiert je nach Windows-Version und dem Wert von Process. Der Standardwert ist 0x3, wenn Process ausgelassen wird oder wenn Process entweder 0 oder -1 ist. Andernfalls ist der Standardwert 0xF.
Bit 0 (0x1)
Zeigt Zeit- und Prioritätsstatistiken an.
Bit 1 (0x2)
Zeigt eine Liste der Threads und Ereignisse an, die dem Prozess zugeordnet sind, und deren Wartestatus.
Bit 2 (0x4)
Zeigt eine Liste der Threads an, die dem Prozess zugeordnet sind. Wenn dies ohne Bit 1 (0x2) enthalten ist, wird jeder Thread in einer einzelnen Zeile angezeigt. Wenn dies zusammen mit Bit 1 enthalten ist, wird jeder Thread mit einer Ablaufverfolgung angezeigt.
Bit 3 (0x8)
Zeigt die Absenderadresse und den Stapelzeiger für jede Funktion an. Die Anzeige von Funktionsargumenten wird unterdrückt.
Bit 4 (0x10)
Legt den Prozesskontext auf den angegebenen Prozess für die Dauer dieses Befehls fest. Dies führt zu einer genaueren Anzeige von Thread-Stapeln. Da dieses Flag der Verwendung von .process /p /r für den angegebenen Prozess entspricht, werden alle vorhandenen Benutzermodullisten verworfen. Wenn Process null ist, zeigt der Debugger alle Prozesse an, und der Prozesskontext wird für jeden Prozess geändert. Wenn Sie nur einen einzelnen Prozess anzeigen und dessen Benutzermodusstatus bereits aktualisiert wurde (z. B. mit .process /p /r), ist die Verwendung dieses Flags nicht erforderlich. Dieses Flag ist nur wirksam, wenn es mit Bit 0 (0x1) verwendet wird.
ImageName
Gibt den Namen des Prozesses an, der angezeigt werden soll. Der Debugger zeigt alle Prozesse an, deren ausführbare Bildnamen mit ImageName übereinstimmen. Der Bildname muss dem Namen im EPROCESS-Block entsprechen. Im Allgemeinen ist dies der Name der ausführbaren Datei, die zum Starten des Prozesses aufgerufen wurde, einschließlich der Dateierweiterung (normalerweise .exe). Er wird nach dem fünfzehnten Zeichen abgeschnitten. Es gibt keine Möglichkeit, einen Bildnamen anzugeben, der ein Leerzeichen enthält. Wenn ImageName angegeben ist, muss Process null sein.
DLL
Kdexts.dll
Zusätzliche Informationen
Informationen zu Prozessen im Kernelmodus finden Sie unter Ändern von Kontexten. Weitere Informationen zur Analyse von Prozessen und Threads finden Sie unter Microsoft Windows Internals, von Mark Russinovich und David Solomon.
Hinweise
Im Folgenden finden Sie ein Beispiel für eine !process 0 0-Anzeige:
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
In der folgenden Tabelle werden einige der Elemente der !process 0 0-Ausgabe beschrieben.
Element | Bedeutung |
---|---|
Prozessadresse |
Die achtstellige Hexadezimalzahl nach dem Wort PROCESS ist die Adresse des EPROCESS-Blocks. Im letzten Eintrag im vorherigen Beispiel ist die Prozessadresse 0x809258E0. |
Prozess-ID (PID) |
Die Hexadezimalzahl nach dem Wort Cid. Im letzten Eintrag im vorherigen Beispiel ist die PID 0x44 oder dezimal 68. |
Prozessumgebungsblock (PEB) |
Die Hexadezimalzahl nach dem Wort Peb ist die Adresse des Prozessumgebungsblocks. Im letzten Eintrag im vorherigen Beispiel befindet sich das PEB an der Adresse 0x7FFDE000. |
Übergeordnete Prozess-PID |
Die Hexadezimalzahl nach dem Wort ParentCid ist die PID des übergeordneten Prozesses. Im letzten Eintrag im vorherigen Beispiel ist die PID des übergeordneten Prozesses 0x26 oder dezimal 38. |
Abbildung |
Der Name des Moduls, das den Prozess besitzt. Im letzten Eintrag im vorherigen Beispiel ist der Besitzer spoolss.exe. Im ersten Eintrag ist der Besitzer das Betriebssystem selbst. |
Prozessobjektadresse |
Die Hexadezimalzahl nach dem Wort ObjectTable. Im letzten Eintrag im vorherigen Beispiel lautet die Adresse des Prozessobjekts 0x80925c68. |
Um vollständige Details zu einem Prozess anzuzeigen, legen Sie Flags auf 7 fest. Der Prozess selbst kann angegeben werden, indem Process gleich der Prozessadresse, Process gleich der Prozess-ID oder ImageName gleich dem Namen des ausführbaren Bilds festgelegt wird. Hier ist ein Beispiel:
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
Beachten Sie, dass die Adresse des Prozessobjekts als Eingabe für andere Erweiterungen verwendet werden kann, z. B. !handle, um weitere Informationen zu erhalten.
In der folgenden Tabelle werden einige der Elemente im vorherigen Beispiel beschrieben.
Element | Bedeutung |
---|---|
WAIT | Der Kommentar in Klammern nach dieser Überschrift gibt den Grund für die Wartezeit an. Der Befehl dt nt!_KWAIT_REASON zeigt eine Liste mit allen Gründen für Wartezeiten an. |
ElapsedTime |
Führt die Zeitspanne auf, die seit der Erstellung des Prozesses verstrichen ist. Dies wird in Einheiten von Hours:Minutes:Seconds.Milliseconds angezeigt. |
UserTime |
Führt die Zeitspanne auf, in der der Prozess im Benutzermodus ausgeführt wurde. Wenn der Wert für UserTime außergewöhnlich hoch ist, kann er einen Prozess identifizieren, der Systemressourcen aufbraucht. Einheiten sind mit denen von ElapsedTime identisch. |
KernelTime |
Führt die Zeitspanne auf, in der der Prozess im Kernelmodus ausgeführt wurde. Wenn der Wert für KernelTime außergewöhnlich hoch ist, kann er einen Prozess identifizieren, der Systemressourcen aufbraucht. Einheiten sind mit denen von ElapsedTime identisch. |
Arbeitssatzgröße |
Führt die aktuelle, minimale und maximale Arbeitssatzgröße für den Prozess auf Seiten auf. Eine außergewöhnlich große Arbeitssatzgröße kann ein Zeichen für einen Prozess sein, bei dem Arbeitsspeicher verloren geht oder Systemressourcen ausgeschöpft sind. |
QuotaPoolUsage-Einträge |
Führt den vom Prozess verwendeten ausgelagerten und nicht ausgelagerten Pool auf. Auf einem System mit einem Speicherverlust können Sie anhand der übermäßigen Nutzung nicht ausgelagerter Pools bei allen Prozessen feststellen, bei welchem Prozess der Speicherverlust vorliegt. |
Klon |
Gibt an, ob der Prozess von den POSIX- oder Interix-Subsystemen erstellt wurde. |
Privat |
Gibt die Anzahl der privaten (nicht teilbaren) Seiten an, die derzeit vom Prozess verwendet werden. Dies umfasst sowohl ein- als auch ausgelagerten Speicher. |
Zusätzlich zu den Prozesslisteninformationen enthalten die Thread-Informationen eine Liste der Ressourcen, für die der Thread Sperren hat. Diese Informationen werden in der dritten Ausgabezeile nach dem Threadheader aufgeführt. In diesem Beispiel verfügt der Thread über eine Sperre für eine Ressource, ein SynchronizationEvent mit einer Adresse von 80144fc0. Wenn Sie diese Adresse mit der Liste der Sperren vergleichen, die von der Erweiterung !kdext*.locks angezeigt werden, können Sie bestimmen, welche Threads exklusive Sperren für Ressourcen haben.
Die Erweiterung !stacks gibt einen kurzen Überblick über den Status jedes Threads. Dies kann anstelle der Erweiterung !process verwendet werden, um einen schnellen Überblick über das System zu erhalten, insbesondere beim Debuggen von Multithread-Problemen wie Ressourcenkonflikten oder Deadlocks.