Punti di interruzione del processore (ba Punti di interruzione)
I punti di interruzione controllati dal processore alla richiesta del debugger sono noti come punti di interruzione del processore o punti di interruzione dei dati. I punti di interruzione controllati direttamente dal debugger sono noti come punti di interruzione software.
Nota Anche se il termine punto di interruzione dei dati viene comunemente usato come sinonimo del punto di interruzione del processore, questo termine può essere fuorviante. Esistono due tipi fondamentali di punti di interruzione: i punti di interruzione del processore, controllati dal processore e dai punti di interruzione software, controllati dal debugger. I punti di interruzione del processore vengono in genere impostati sui dati del programma, ovvero il motivo per cui vengono chiamati "punti di interruzione dei dati", ma possono essere impostati anche nel codice eseguibile. I punti di interruzione software vengono in genere impostati nel codice eseguibile, ma possono anche essere impostati sui dati del programma. Sfortunatamente, nella letteratura di debug è comune fare riferimento ai punti di interruzione del processore come "punti di interruzione dei dati", anche quando vengono impostati nel codice eseguibile.
Punti di interruzione processore
Un punto di interruzione del processore viene attivato quando si accede a una posizione di memoria specifica. Esistono quattro tipi di punti di interruzione del processore, corrispondenti al tipo di accesso alla memoria che lo attiva:
Tipo di punto di interruzione | Azione |
---|---|
e (esecuzione) | Attivato quando il processore recupera un'istruzione dall'indirizzo specificato. |
r (lettura/scrittura) | Attivato quando il processore legge o scrive memoria in corrispondenza dell'indirizzo specificato. |
w (scrittura) | Attivato quando il processore scrive memoria in corrispondenza dell'indirizzo specificato. |
i (i/o) | Attivato quando si accede alla porta di I/O in corrispondenza dell'indirizzo specificato. |
A ogni punto di interruzione del processore è associata una dimensione. Ad esempio, un punto di interruzione del processore w (scrittura) può essere impostato in corrispondenza dell'indirizzo 0x70001008 con una dimensione di quattro byte. Ciò consente di monitorare il blocco di indirizzi da 0x70001008 a 0x7000100B, inclusi. Se questo blocco di memoria viene scritto in , verrà attivato il punto di interruzione.
Può verificarsi che il processore esegua un'operazione su un'area di memoria che si sovrappone a, ma non è identica all'area specificata. Nell'esempio specificato nel paragrafo precedente, una singola operazione di scrittura che include l'intervallo 0x70001000 da 0x7000100F o un'operazione di scrittura che include solo il byte in corrispondenza del 0x70001009, sarebbe un'operazione sovrapposta. In una situazione di questo tipo, se il punto di interruzione viene attivato è dipendente dal processore. Per informazioni dettagliate sulla gestione di questa situazione in un processore specifico, consultare il manuale dell'architettura del processore e cercare "registro di debug" o "registro di controllo di debug". Per accettare un tipo di processore specifico come esempio, in un processore x86 viene attivato un punto di interruzione di lettura o scrittura ogni volta che l'intervallo a cui si accede si sovrappone all'intervallo di punti di interruzione.
Analogamente, se viene impostato un punto di interruzione e (esecuzione) sul 0x00401003 dell'indirizzo e quindi viene eseguita un'istruzione a due byte che si estende sugli indirizzi 0x00401002 e 0x00401003 viene eseguito, il risultato dipende dal processore. Per informazioni dettagliate, consultare il manuale dell'architettura del processore.
Il processore distingue tra i punti di interruzione impostati da un debugger in modalità utente e i punti di interruzione impostati da un debugger in modalità kernel. Un punto di interruzione del processore in modalità utente non influisce sui processi in modalità kernel. Un punto di interruzione del processore in modalità kernel potrebbe o meno influire su un processo in modalità utente, a seconda che il codice in modalità utente usi lo stato del registro di debug e se sia collegato un debugger in modalità utente.
Per applicare i punti di interruzione dei dati esistenti del processo corrente a un contesto di registro diverso, usare il comando .apply_dbp (Applica punto di interruzione dati al contesto).
In un computer multiprocessore ogni punto di interruzione del processore si applica a tutti i processori. Ad esempio, se il processore corrente è 3 e si usa il comando ba e1 MyAddress
per inserire un punto di interruzione in MyAddress, qualsiasi processore, non solo processore 3, che viene eseguito in tale indirizzo attiva il punto di interruzione. Questo vale anche per i punti di interruzione software.
Punti di interruzione software
I punti di interruzione software, a differenza dei punti di interruzione del processore, sono controllati dal debugger. Quando il debugger imposta un punto di interruzione software in una posizione, sostituisce temporaneamente il contenuto di tale posizione di memoria con un'istruzione di interruzione. Il debugger memorizza il contenuto originale di questo percorso, in modo che se la memoria viene visualizzata nel debugger, il debugger visualizzerà il contenuto originale di tale percorso di memoria, non l'istruzione di interruzione. Quando il processo di destinazione esegue il codice in questa posizione, l'istruzione di interruzione causa l'interruzione del processo nel debugger. Dopo aver eseguito qualsiasi azione scelta, è possibile fare in modo che la destinazione riprenda l'esecuzione e l'esecuzione riprenderà con l'istruzione originariamente presente in tale posizione.
Disponibilità dei tipi di punti di interruzione del processore
L'opzione i (i/o) è disponibile solo durante il debug in modalità kernel.
Non tutte le dimensioni dei dati possono essere usate con tutti i tipi di punti di interruzione del processore. Le dimensioni consentite dipendono dal processore del computer di destinazione. Per informazioni dettagliate, vedere ba (Interruzione sull'accesso).
Limitazioni dei punti di interruzione software e dei punti di interruzione del processore
È possibile specificare un indirizzo dati anziché un indirizzo di programma quando si usano i comandi bp o bm /a. Tuttavia, anche se viene specificato un percorso dati, questi comandi creano punti di interruzione software, non punti di interruzione del processore. Quando il debugger posiziona un punto di interruzione software in una posizione, sostituisce temporaneamente il contenuto di tale posizione di memoria con un'istruzione di interruzione. Ciò non danneggia l'immagine eseguibile, perché il debugger memorizza il contenuto originale di questo percorso e quando il processo di destinazione tenta di eseguire questo codice il debugger può rispondere in modo appropriato. Tuttavia, quando un punto di interruzione software viene impostato in una posizione dati, la sovrascrittura risultante può causare il danneggiamento dei dati. Pertanto, l'impostazione di un punto di interruzione software in un percorso dati è sicura solo se si è certi che questa posizione verrà usata solo come codice eseguibile.
I comandi bp, bu e bm impostano punti di interruzione software sostituendo l'istruzione del processore con un'istruzione di interruzione. Di conseguenza, questi non possono essere usati nel codice di sola lettura o in qualsiasi altro codice che non può essere sovrascritto. Per impostare un punto di interruzione in tale codice, è necessario usare ba (Break on Access) con l'opzione e (execute).
Non è possibile creare più punti di interruzione del processore con lo stesso indirizzo che differiscono solo nel comando eseguito automaticamente quando viene attivato il punto di interruzione. Tuttavia, è possibile creare più punti di interruzione con lo stesso indirizzo che differiscono nelle altre restrizioni, ad esempio è possibile creare più punti di interruzione con lo stesso indirizzo usando il comando ba con valori diversi delle opzioni /p, /t, /c e /C .
Il punto di interruzione iniziale in un processo in modalità utente (in genere impostato sulla funzione principale o sul relativo equivalente) non può essere un punto di interruzione del processore.
Il numero di punti di interruzione del processore supportati dipende dall'architettura del processore di destinazione.
Controllo dei punti di interruzione software e dei punti di interruzione del processore
I punti di interruzione software possono essere creati con i comandi bp (Set Breakpoint), bm (Set Symbol Breakpoint) e bu (Set Unresolved Breakpoint) (Imposta punto di interruzione non risolto). I punti di interruzione del processore possono essere creati con il comando ba (Break on Access). I comandi che disabilitano, abilitano e modificano i punti di interruzione si applicano a tutti i tipi di punti di interruzione. I comandi che visualizzano un elenco di punti di interruzione includono tutti i punti di interruzione e indicano il tipo di ognuno. Per un elenco di questi comandi, vedere Metodi di controllo dei punti di interruzione.
Nella finestra di dialogo Punti di interruzione WinDbg vengono visualizzati tutti i punti di interruzione, che indicano i punti di interruzione del processore con la notazione "e", "r", "w" o "i" seguito dalle dimensioni del blocco. Questa finestra di dialogo può essere utilizzata per modificare qualsiasi punto di interruzione. La casella di testo Comando in questa finestra di dialogo può essere usata per creare qualsiasi tipo di punto di interruzione. Se si desidera un punto di interruzione del processore, iniziare l'input con "ba". Quando si imposta un punto di interruzione usando il mouse nella finestra Disassembly winDbg o nella finestra Origine, il debugger crea un punto di interruzione software non risolto.
I punti di interruzione del processore vengono archiviati nei registri di debug del processore. È possibile impostare un punto di interruzione modificando manualmente un valore del registro di debug, ma questo è fortemente sconsigliato.