!processo
L'estensione !process visualizza informazioni sul processo specificato o su tutti i processi, incluso il blocco EPROCESS.
Questa estensione può essere usata solo durante il debug in modalità kernel.
Sintassi
!process [/s Session] [/m Module] [Process [Flags]]
!process [/s Session] [/m Module] 0 Flags ImageName
Parametri
/s **** Sessione
Specifica la sessione proprietaria del processo desiderato.
Modulo /m ****
Specifica il modulo proprietario del processo desiderato.
Processo
Specifica l'indirizzo esadecimale o l'ID del processo nel computer di destinazione.
Il valore di Process determina se l'estensione !process visualizza un indirizzo di processo o un ID processo. Se Process viene omesso in qualsiasi versione di Windows, il debugger visualizza solo i dati relativi al processo di sistema corrente. Se Process è 0 e ImageName viene omesso, il debugger visualizza informazioni su tutti i processi attivi. Se si specifica -1 per Le informazioni sul processo corrente vengono visualizzate.
Flag
Specifica il livello di dettaglio da visualizzare. I flag possono essere qualsiasi combinazione dei bit seguenti. Se Flags è 0, viene visualizzata solo una quantità minima di informazioni. Il valore predefinito varia in base alla versione di Windows e al valore di Process. Il valore predefinito è 0x3 se Process viene omesso o se Process è 0 o -1; in caso contrario, il valore predefinito è 0xF.
Bit 0 (0x1)
Visualizza le statistiche relative all'ora e alla priorità.
Bit 1 (0x2)
Visualizza un elenco di thread ed eventi associati al processo e i relativi stati di attesa.
Bit 2 (0x4)
Visualizza un elenco di thread associati al processo. Se è incluso senza Bit 1 (0x2), ogni thread viene visualizzato su una singola riga. Se viene incluso insieme a Bit 1, ogni thread viene visualizzato con un'analisi dello stack.
Bit 3 (0x8)
Visualizza l'indirizzo restituito e il puntatore dello stack per ogni funzione La visualizzazione degli argomenti della funzione viene eliminata.
Bit 4 (0x10)
Imposta il contesto del processo uguale al processo specificato per la durata di questo comando. Ciò comporta una visualizzazione più accurata degli stack di thread. Poiché questo flag equivale all'uso di .process /p /r per il processo specificato, qualsiasi elenco di moduli in modalità utente esistente verrà rimosso. Se Process è zero, il debugger visualizza tutti i processi e il contesto del processo viene modificato per ognuno di essi. Se si visualizza solo un singolo processo e il relativo stato in modalità utente è già stato aggiornato (ad esempio, con .process /p /r), non è necessario usare questo flag. Questo flag è efficace solo se usato con Bit 0 (0x1).
ImageName
Specifica il nome del processo da visualizzare. Il debugger visualizza tutti i processi i cui nomi di immagine eseguibile corrispondono a ImageName. Il nome dell'immagine deve corrispondere a quello nel blocco EPROCESS. In generale, si tratta del nome eseguibile richiamato per avviare il processo, inclusa l'estensione di file (in genere .exe) e troncata dopo il quindicesimo carattere. Non è possibile specificare un nome di immagine contenente uno spazio. Quando si specifica ImageName , Process deve essere zero.
DLL
Kdexts.dll
Informazioni aggiuntive
Per informazioni sui processi in modalità kernel, vedere Modifica dei contesti. Per altre informazioni sull'analisi di processi e thread, vedere Microsoft Windows Internals, di Mark Russinovich e David Solomon.
Osservazioni:
Di seguito è riportato un esempio di visualizzazione !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
La tabella seguente descrive alcuni degli elementi dell'output !process 0 0 .
Elemento | significato |
---|---|
Indirizzo del processo |
Il numero esadecimale a otto caratteri dopo la parola PROCESS è l'indirizzo del blocco EPROCESS. Nella voce finale dell'esempio precedente, l'indirizzo del processo è 0x809258E0. |
ID processo (PID) |
Numero esadecimale dopo la parola Cid. Nella voce finale dell'esempio precedente il PID è 0x44 o decimale 68. |
Blocco dell'ambiente di elaborazione (PEB) |
Numero esadecimale dopo la parola Peb è l'indirizzo del blocco di ambiente del processo. Nella voce finale dell'esempio precedente, il PEB si trova all'indirizzo 0x7FFDE000. |
PID processo padre |
Il numero esadecimale dopo la parola ParentCid è il PID del processo padre. Nella voce finale dell'esempio precedente il PID del processo padre è 0x26 o decimale 38. |
Immagine |
Nome del modulo proprietario del processo. Nella voce finale dell'esempio precedente il proprietario è spoolss.exe. Nella prima voce il proprietario è il sistema operativo stesso. |
Indirizzo dell'oggetto processo |
Numero esadecimale dopo la parola ObjectTable. Nella voce finale dell'esempio precedente, l'indirizzo dell'oggetto processo è 0x80925c68. |
Per visualizzare i dettagli completi su un processo, impostare Flag su 7. Il processo stesso può essere specificato impostando Process uguale all'indirizzo del processo, impostando Process uguale all'ID processo o impostando ImageName uguale al nome dell'immagine eseguibile. Ecco un esempio:
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
Si noti che l'indirizzo dell'oggetto processo può essere usato come input per altre estensioni, ad esempio !handle, per ottenere ulteriori informazioni.
Nella tabella seguente vengono descritti alcuni degli elementi dell'esempio precedente.
Elemento | significato |
---|---|
ASPETTARE | Il commento tra parentesi dopo questa intestazione indica il motivo dell'attesa. Il comando dt nt!_KWAIT_REASON visualizzerà un elenco di tutti i motivi di attesa. |
ElapsedTime |
Elenca l'intervallo di tempo trascorso dopo la creazione del processo. Questa opzione viene visualizzata in unità di ore:minuti:secondi.millisecondi. |
Tempi |
Elenca la quantità di tempo in cui il processo è stato eseguito in modalità utente. Se il valore di UserTime è estremamente elevato, potrebbe identificare un processo che sta esaurendo le risorse di sistema. Le unità sono uguali a quelle di ElapsedTime. |
KernelTime |
Elenca la quantità di tempo in cui il processo è stato eseguito in modalità kernel. Se il valore per KernelTime è estremamente elevato, potrebbe identificare un processo che sta esaurendo le risorse di sistema. Le unità sono uguali a quelle di ElapsedTime. |
Dimensioni del set di lavoro |
Elenca le dimensioni correnti, minime e massime del working set per il processo, nelle pagine. Una dimensione del working set estremamente grande può essere un segno di un processo che sta perdendo memoria o esaurisce le risorse di sistema. |
Voci QuotaPoolUsage |
Elenca il pool di paging e non di paging utilizzato dal processo. In un sistema con una perdita di memoria, cercare un utilizzo eccessivo di pool non di paging in tutti i processi può indicare quale processo ha la perdita di memoria. |
Clona |
Indica se il processo è stato creato dai sottosistemi POSIX o Interix. |
Privata |
Indica il numero di pagine private (non condivisibili) attualmente utilizzate dal processo. Sono inclusi sia il paging in che la memoria di paging.This includes both paged in and paged out memory. |
Oltre alle informazioni sull'elenco dei processi, le informazioni sul thread contengono un elenco delle risorse in cui il thread ha blocchi. Queste informazioni sono elencate nella terza riga di output dopo l'intestazione del thread. In questo esempio il thread ha un blocco su una risorsa, synchronizationEvent con un indirizzo 80144fc0. Confrontando questo indirizzo con l'elenco dei blocchi visualizzati dall'estensione !sessionxt*.locks , è possibile determinare quali thread hanno blocchi esclusivi sulle risorse.
L'estensione !stacks fornisce un breve riepilogo dello stato di ogni thread. Questa opzione può essere usata invece dell'estensione !process per ottenere una rapida panoramica del sistema, soprattutto quando si esegue il debug di problemi multithread, ad esempio conflitti di risorse o deadlock.