!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.