Condividi tramite


Suddivisione nel debugger

Il codice in modalità utente e in modalità kernel usa routine diverse per eseguire l'interruzione nel debugger.

routine di interruzione User-Mode

Una routine di interruzione fa sì che si verifichi un'eccezione nel processo corrente, in modo che il thread chiamante possa segnalare il debugger associato al processo chiamante.

Per suddividere un debugger da un programma in modalità utente, usare la funzione DebugBreak. Il prototipo è il seguente:

VOID DebugBreak(VOID);

Quando un programma in modalità utente chiama DebugBreak, si verificheranno le azioni seguenti:

  1. Se è collegato un debugger in modalità utente, il programma verrà suddiviso nel debugger. Ciò significa che il programma verrà sospeso e il debugger diventerà attivo.

  2. Se un debugger in modalità utente non è collegato, ma il debug in modalità kernel è stato abilitato al momento dell'avvio, l'intero computer si interromperà nel debugger del kernel. Se un debugger del kernel non è collegato, il computer si blocca e attende un debugger del kernel.

  3. Se un debugger in modalità utente non è collegato e il debug in modalità kernel non è abilitato, il programma terminerà con un'eccezione non gestita e verrà attivato il debugger post-mortem (just-in-time). Per altre informazioni, vedere Abilitazione del debug postmortem.

routine di interruzione Kernel-Mode

Quando un programma in modalità kernel si interrompe nel debugger, l'intero sistema operativo si blocca fino a quando il debugger del kernel non consente la ripresa dell'esecuzione. Se non è presente alcun debugger del kernel, questo viene considerato come un controllo di bug.

La routine DbgBreakPoint funziona nel codice in modalità kernel, ma è diversamente simile alla routine DebugBreak in modalità utente.

Anche la routine DbgBreakPointWithStatus causa un'interruzione, ma invia anche un codice di stato a 32 bit al debugger.

Le routine KdBreakPoint e KdBreakPointWithStatus sono identiche rispettivamente a DbgBreakPoint e DbgBreakPointWithStatus, quando vengono compilate nell'ambiente di compilazione selezionato. Quando vengono compilati nell'ambiente di compilazione gratuito, non hanno alcun effetto.

routine di interruzione condizionale Kernel-Mode

Per il codice in modalità kernel sono disponibili due routine di interruzione condizionale. Queste routine testano un'espressione logica. Se l'espressione è false, l'esecuzione viene interrotta e il debugger diventa attivo.

  • La macro ASSERT verifica un'espressione logica. Se l'espressione è false, l'esecuzione viene interrotta e il debugger diventa attivo. L'espressione non riuscita e il relativo percorso nel programma vengono visualizzati nel debugger.

  • La macro ASSERTMSG è identica a ASSERT , ad eccezione del fatto che consente l'invio di un messaggio aggiuntivo al debugger.

ASSERT e ASSERTMSG sono attivi solo quando vengono compilati nell'ambiente di compilazione controllato. Quando vengono compilati nell'ambiente di compilazione gratuito, non hanno alcun effetto.