Condividi tramite


Modifica dei contesti

Nel debug in modalità kernel sono presenti molti processi, thread e talvolta sessioni utente in esecuzione contemporaneamente. Pertanto, le frasi come "indirizzo virtuale 0x80002000" o "registro eax " sono ambigue. È necessario specificare il contesto in cui è possibile comprendere tali frasi.

Il debugger ha cinque contesti diversi che è possibile impostare durante il debug:

  1. Il contesto della sessione indica la sessione utente predefinita.

  2. Il contesto del processo determina il modo in cui il debugger interpreta gli indirizzi virtuali.

  3. Il contesto dell'indirizzo in modalità utente non viene quasi mai impostato direttamente. Questo contesto viene impostato automaticamente quando si modifica il contesto del processo.

  4. Il contesto del registro determina il modo in cui il debugger interpreta i registri e controlla anche i risultati di un'analisi dello stack. Questo contesto è noto anche come contesto del thread, anche se tale termine non è completamente accurato. Un contesto esplicito è anche un tipo di contesto di registro. Se si specifica un contesto esplicito, tale contesto viene usato anziché il contesto del registro corrente.

  5. Il contesto locale determina il modo in cui il debugger interpreta le variabili locali. Questo contesto è noto anche come ambito.

Contesto sessione

Più sessioni di accesso possono essere eseguite contemporaneamente. Ogni sessione di accesso ha processi specifici.

L'estensione !session visualizza tutte le sessioni di accesso o modifica il contesto della sessione corrente.

Il contesto della sessione viene usato dalle estensioni !sprocess e !spoolused quando il numero di sessione viene immesso come "-2".

Quando il contesto della sessione viene modificato, il contesto del processo viene modificato automaticamente nel processo attivo per tale sessione.

Contesto del processo

Ogni processo ha una propria directory di pagine che registra il mapping degli indirizzi virtuali agli indirizzi fisici. Quando un thread all'interno di un processo è in esecuzione, il sistema operativo Windows usa questa directory di pagina per interpretare gli indirizzi virtuali.

Durante il debug in modalità utente, il processo corrente determina il contesto del processo. Gli indirizzi virtuali usati nei comandi del debugger, nelle estensioni e nelle finestre delle informazioni di debug vengono interpretati usando la directory di pagina del processo corrente.

Durante il debug in modalità kernel, è possibile impostare il contesto del processo usando il comando .process (Set Process Context). Usare questo comando per selezionare la directory della pagina del processo usata per interpretare gli indirizzi virtuali. Dopo aver impostato il contesto del processo, è possibile usare questo contesto in qualsiasi comando che accetta indirizzi. È anche possibile impostare punti di interruzione in questo indirizzo. Includendo un'opzione /i nel comando .process per specificare il debug invasivo, è anche possibile usare il debugger del kernel per impostare i punti di interruzione nello spazio utente.

È anche possibile impostare punti di interruzione in modalità utente dal debugger del kernel usando un punto di interruzione specifico del processo in una funzione dello spazio del kernel. Impostare punti di interruzione strategici e attendere che venga visualizzato il contesto appropriato.

Il contesto dell'indirizzo in modalità utente fa parte del contesto del processo. In genere, non è necessario impostare direttamente il contesto dell'indirizzo in modalità utente. Se si imposta il contesto del processo, il contesto dell'indirizzo in modalità utente passa automaticamente alla base di directory della tabella di pagine pertinente per il processo.

Quando si imposta il contesto del processo durante il debug in modalità kernel, tale contesto di processo viene mantenuto fino a quando un altro comando con estensione process non modifica il contesto. Il contesto dell'indirizzo in modalità utente viene mantenuto anche fino a quando non viene modificato da un comando .process o .context . Questi contesti non vengono modificati quando viene eseguito il computer di destinazione e non sono interessati dalle modifiche apportate al contesto di registrazione o al contesto locale.

Registra contesto

Ogni thread ha i propri valori di registro. Questi valori vengono archiviati nei registri della CPU quando il thread è in esecuzione e vengono archiviati in memoria quando viene eseguito un altro thread.

Durante il debug in modalità utente, il thread corrente determina in genere il contesto di registrazione. Qualsiasi riferimento ai registri nei comandi del debugger, nelle estensioni e nelle finestre delle informazioni di debug viene interpretato in base ai registri del thread corrente.

È possibile modificare il contesto del registro in un valore diverso dal thread corrente durante l'esecuzione del debug in modalità utente usando uno dei comandi seguenti:

.cxr (Display Context Record)

.ecxr (Display Exception Context Record)

Durante il debug in modalità kernel, è possibile controllare il contesto del registro usando un'ampia gamma di comandi del debugger, inclusi i comandi seguenti:

Thread (Imposta contesto registro)

.cxr (Display Context Record)

.trap (Display Trap Frame)

Questi comandi non modificano i valori dei registri della CPU. Il debugger recupera invece il contesto del registro specificato dalla posizione in memoria. In realtà, il debugger può recuperare solo i valori di registro salvati . Gli altri valori vengono impostati in modo dinamico e non vengono salvati. I valori salvati sono sufficienti per ricreare un'analisi dello stack.

Dopo aver impostato il contesto del registro, il nuovo contesto del registro viene usato per tutti i comandi che usano valori di registro, ad esempio k (Display Stack Backtrace) e r (Registers).After the register context is used for any commands that use register values, such as k (Display Stack Backtrace) and r (Registers).

Tuttavia, quando si esegue il debug di computer multiprocessore, alcuni comandi consentono di specificare un processore. Per altre informazioni su tali comandi, vedere Sintassi multiprocessore. Se si specifica un processore per un comando, il comando usa il contesto del registro del thread attivo nel processore specificato invece del contesto di registro corrente, anche se il processore specificato è attualmente attivo.

Inoltre, se il contesto del registro non corrisponde all'impostazione corrente della modalità processore, questi comandi producono output non corretto o senza significato. Per evitare gli errori di output, i comandi che dipendono dallo stato del registro hanno esito negativo fino a quando non si modifica la modalità processore in modo che corrisponda al contesto del registro. Per modificare la modalità processore, usare il comando .effmach (Effective Machine),

La modifica del contesto del registro può anche modificare il contesto locale. In questo modo, il contesto del registro può influire sulla visualizzazione delle variabili locali.

Se si verifica un'esecuzione, un'istruzione o una traccia dell'applicazione, il contesto del registro viene immediatamente reimpostato in modo che corrisponda alla posizione del contatore del programma. In modalità utente, il contesto di registrazione viene reimpostato anche se il processo o il thread corrente viene modificato.

Il contesto del registro influisce sulle tracce dello stack, perché l'analisi dello stack inizia nella posizione a cui punta il registro del puntatore dello stack (esp in un processore basato su x86). Se il contesto del registro è impostato su un valore non valido o inaccessibile, non è possibile ottenere le tracce dello stack.

È possibile applicare un punto di interruzione del processore (punto di interruzione dati) a un contesto di registro specifico usando il comando .apply_dbp (Applica punto di interruzione dati al contesto).

Contesto locale

Quando un programma è in esecuzione, il significato delle variabili locali dipende dalla posizione del contatore del programma, perché l'ambito di tali variabili si estende solo alla funzione in cui sono definiti.

Quando si esegue il debug in modalità utente o in modalità kernel, il debugger usa l'ambito della funzione corrente (il frame corrente nello stack) come contesto locale. Per modificare questo contesto, usare il comando .frame (Imposta contesto locale) oppure fare doppio clic sul frame desiderato nella finestra Chiamate.

Nel debug in modalità utente, il contesto locale è sempre un frame all'interno dell'analisi dello stack del thread corrente. Nel debug in modalità kernel, il contesto locale è sempre un frame all'interno dell'analisi dello stack del thread del contesto del registro corrente.

È possibile usare un solo stack frame alla volta per il contesto locale. Non è possibile accedere alle variabili locali in altri frame.

Il contesto locale viene reimpostato se si verifica uno degli eventi seguenti:

  • Qualsiasi esecuzione del programma, esecuzione di istruzioni o traccia

  • Qualsiasi uso del delimitatore di thread (~) in qualsiasi comando

  • Qualsiasi modifica al contesto di registrazione

L'estensione !for_each_frame consente di eseguire ripetutamente un singolo comando, una volta per ogni fotogramma nello stack. Questo comando modifica il contesto locale per ogni frame, esegue il comando specificato e quindi restituisce il contesto locale al valore originale.