Condividi tramite


Thread (Imposta contesto registro)

Il comando .thread specifica il thread che verrà usato per il contesto di registrazione.

.thread [/p [/r] ] [/P] [/w] [Thread]

Parametri

/p
(solo debug in tempo reale) Se questa opzione è inclusa e Thread è diverso da zero, tutte le voci della tabella di pagina di transizione per il processo proprietario di questo thread verranno convertite automaticamente in indirizzi fisici prima dell'accesso. Ciò può causare rallentamenti, perché il debugger dovrà cercare gli indirizzi fisici per tutta la memoria usata da questo processo e potrebbe essere necessario trasferire una quantità significativa di dati attraverso il cavo di debug. Questo comportamento è uguale a quello di . cache forcedecodeuser.

Se l'opzione /p è inclusa e Thread è zero o omesso, questa traduzione verrà disabilitata. Questo comportamento è uguale a quello di . cache noforcedecodeuser.

/r
(solo debug in tempo reale) Se l'opzione /r è inclusa insieme all'opzione /p , i simboli in modalità utente per il processo proprietario di questo thread verranno ricaricati dopo aver impostato il processo e registrare i contesti. Questo comportamento è uguale a quello di . ricaricare /user.)

/P
(solo debug in tempo reale) Se questa opzione è inclusa e Thread è diverso da zero, tutte le voci della tabella di pagine di transizione (PTE) verranno convertite automaticamente in indirizzi fisici prima dell'accesso. A differenza dell'opzione /p , questo converte i ptes per tutti i processi in modalità utente e in modalità kernel, non solo il processo proprietario di questo thread. Ciò può causare rallentamenti, perché il debugger dovrà cercare gli indirizzi fisici per tutta la memoria in uso e potrebbe essere necessario trasferire una grande quantità di dati attraverso il cavo di debug. Questo comportamento è uguale a quello di . cache forcedecodeptes.

/w
(solo debug del kernel a 64 bit) Modifica il contesto attivo per il thread nel contesto a 32 bit WOW64. Il thread specificato deve essere in esecuzione in un processo con stato WOW64.

Filo
Indirizzo del thread. Se questo viene omesso o zero, il contesto del thread viene reimpostato sul thread corrente.

Ambiente

Articolo Descrizione
Modalità Solo modalità kernel
Target live, dump di arresto anomalo
Piattaforme tutto

Informazioni aggiuntive

Per altre informazioni sul contesto di registrazione e altre impostazioni di contesto, vedere Modifica dei contesti.

Osservazioni:

In genere, quando si esegue il debug del kernel, gli unici registri visibili sono quelli associati al thread corrente.

Il comando .thread indica al debugger del kernel di usare il thread specificato come contesto di registrazione. Dopo l'esecuzione di questo comando, il debugger avrà accesso ai registri più importanti e all'analisi dello stack per questo thread. Questo contesto di registrazione persiste fino a quando non si consente alla destinazione di eseguire o usare un altro comando di contesto di registrazione (.thread, .cxr o .trap). Per informazioni dettagliate, vedere Registrare il contesto .

L'opzione /w può essere usata solo nelle sessioni di debug del kernel a 64 bit in un thread in esecuzione in un processo con stato WOW64. Il contesto recuperato sarà l'ultimo contesto ricordato da WOW64; si tratta in genere dell'ultimo codice in modalità utente eseguito da Thread. Questa opzione può essere usata solo se la destinazione è in modalità computer nativa. Ad esempio, se la destinazione è in esecuzione in un computer a 64 bit che emula un processore basato su x86 con WOW64, questa opzione non può essere usata. Se si usa l'opzione /w , la modalità computer passa automaticamente a un processore basato su x86.

Questo comando non modifica effettivamente il thread corrente. In altre parole, le estensioni come !thread e !teb continueranno a usare il thread corrente se non vengono usati argomenti con essi.

Ecco un esempio. Usare l'estensione !process per trovare l'indirizzo del thread desiderato. In questo caso, !process 0 0 viene usato per elencare tutti i processi, quindi !process viene usato una seconda volta per elencare tutti i thread per il processo desiderato.

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

.....

PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe

kd> !process ffaa5280
PROCESS ffaa5280  SessionId: 0  Cid: 0120    Peb: 7ffdf000  ParentCid: 01e0
    DirBase: 03b70000  ObjectTable: ffaa4e48  TableSize:  23.
    Image: winmine.exe
    VadRoot ffaf6e48 Clone 0 Private 50. Modified 0. Locked 0.
    DeviceMap fe502e88
    Token                             e1b55d70

.....

        THREAD ffaa43a0  Cid 120.3a4  Teb: 7ffde000  Win32Thread: e1b4fea8 WAIT: (WrUserRequest) UserMode Non-Alertable
            ffadc6a0  SynchronizationEvent
        Not impersonating
        Owning Process ffaa5280
        WaitTime (seconds)      24323
        Context Switch Count    494                   LargeStack

.....

Usare ora il comando .thread con l'indirizzo del thread desiderato. Questo imposta il contesto del registro e consente di esaminare i registri importanti e lo stack di chiamate per questo thread.

kd> .thread ffaa43a0
Using context of thread ffaa43a0

kd> r
Last set context:
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=80403a0d esp=fd581c2c ebp=fd581c60 iopl=0         nv up di pl nz na pe nc
cs=0000  ss=0000  ds=0000  es=0000  fs=0000  gs=0000             efl=00000000
0000:3a0d ??              ???

kd> k
  *** Stack trace for last set context - .thread resets it
ChildEBP RetAddr  
fd581c38 8042d61c ntoskrnl!KiSwapThread+0xc5
00001c60 00000000 ntoskrnl!KeWaitForSingleObject+0x1a1