ba (interruzione dell'accesso)
Il comando ba imposta un punto di interruzione del processore (spesso chiamato, meno accuratamente, un punto di interruzione dei dati). Questo punto di interruzione viene attivato quando si accede alla memoria specificata.
Modalità utente
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Modalità kernel
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Parametri
Filo
Specifica il thread a cui si applica il punto di interruzione. Per altre informazioni sulla sintassi, vedere Sintassi dei thread. È possibile specificare thread solo in modalità utente.
ID
Specifica un numero facoltativo che identifica il punto di interruzione. Se non si specifica l'ID, viene usato il primo numero di punto di interruzione disponibile. Non è possibile aggiungere spazio tra ba e il numero ID. Ogni processore supporta solo un numero limitato di punti di interruzione del processore, ma non esiste alcuna restrizione sul valore del numero ID . Se si racchiude l'ID tra parentesi quadre ([]), l'ID può includere qualsiasi espressione. Per altre informazioni sulla sintassi, vedere Sintassi delle espressioni numeriche.
Accesso
Specifica il tipo di accesso che soddisfa il punto di interruzione. Questo parametro può avere uno dei valori seguenti.
Opzione | Azione |
---|---|
e (esecuzione) |
Si interrompe nel debugger quando la CPU recupera un'istruzione dall'indirizzo specificato. |
r (lettura/scrittura) |
Si interrompe nel debugger quando la CPU legge o scrive in corrispondenza dell'indirizzo specificato. |
w (scrittura) |
Si interrompe nel debugger quando la CPU scrive in corrispondenza dell'indirizzo specificato. |
i (i/o) |
(solo modalità kernel, solo sistemi basati su x86) Si interrompe nel debugger quando si accede alla porta di I/O in corrispondenza dell'indirizzo specificato. |
Grandezza
Specifica le dimensioni della posizione, in byte, da monitorare per l'accesso. In un processore basato su x86 questo parametro può essere 1, 2 o 4. Tuttavia, se Access è uguale a e, size deve essere 1.
In un processore basato su x64 questo parametro può essere 1, 2, 4 o 8. Tuttavia, se Access è uguale a e, size deve essere 1.
Opzioni Specifica le opzioni del punto di interruzione. È possibile usare un numero qualsiasi delle opzioni seguenti, ad eccezione di quanto indicato:
/1
Crea un punto di interruzione "one-shot". Dopo l'attivazione di questo punto di interruzione, il punto di interruzione viene rimosso definitivamente dall'elenco dei punti di interruzione.
/p EProcess
(solo modalità kernel) Specifica un processo associato a questo punto di interruzione. EProcess deve essere l'indirizzo effettivo della struttura EPROCESS, non il PID. Il punto di interruzione viene attivato solo se viene rilevato nel contesto di questo processo.
/t EThread
(solo modalità kernel) Specifica un thread associato a questo punto di interruzione. EThread deve essere l'indirizzo effettivo della struttura ETHREAD, non l'ID del thread. Il punto di interruzione viene attivato solo se viene rilevato nel contesto di questo thread. Se si usa /p EProcess e /t EThread , è possibile immetterli in entrambi gli ordini.
/c MaxCallStackDepth
Fa sì che il punto di interruzione sia attivo solo quando la profondità dello stack di chiamate è minore di MaxCallStackDepth. Non è possibile combinare questa opzione con /C.
/C MinCallStackDepth
Fa sì che il punto di interruzione sia attivo solo quando la profondità dello stack di chiamate è maggiore di MinCallStackDepth. Non è possibile combinare questa opzione insieme a /c.
Espressione oggetto /w dx Imposta un punto di interruzione condizionale in base al valore booleano restituito dall'espressione dell'oggetto dx. L'argomento è un'espressione del modello di dati (dx) che restituisce true (corrisponde a condizione - interruzione) o false (non corrisponde a condizione - non interrompere).
In questo esempio viene impostato un punto di interruzione condizionale in base al valore globalVariable. Ciò consente a un punto di interruzione di accesso, ad esempio, di controllare il valore scritto durante la determinazione dell'interruzione del debugger.
ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable
Questo esempio illustra come impostare un punto di interruzione usando JavaScript.
ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable
Per altre informazioni sugli oggetti debugger, vedere dx (Display Debugger Object Model Expression).
Per altre informazioni sui punti di interruzione condizionali, vedere Impostazione di un punto di interruzione condizionale.
Indirizzo
Specifica qualsiasi indirizzo valido. Se l'applicazione accede alla memoria in questo indirizzo, il debugger arresta l'esecuzione e visualizza i valori correnti di tutti i registri e i flag. Questo indirizzo deve essere un offset e allineato in modo adeguato in modo che corrisponda al parametro Size . (ad esempio, se La dimensione è 4. L'indirizzo deve essere un multiplo di 4. Se si omette Address, viene usato il puntatore all'istruzione corrente. Per altre informazioni sulla sintassi, vedere Sintassi dell'intervallo di indirizzi e dell'intervallo di indirizzi.
Passa
Specifica il numero di volte in cui il punto di interruzione viene passato da finché non viene attivato. Questo numero può essere qualsiasi valore a 16 bit. Il numero di volte in cui il contatore del programma passa attraverso questo punto senza interruzioni è minore del valore di questo numero. Pertanto, omettendo questo numero è uguale a impostarlo su 1. Si noti anche che questo numero conta solo le volte in cui l'applicazione viene eseguita oltre questo punto. L'esecuzione o la traccia oltre questo punto non viene conteggiato. Dopo aver raggiunto il conteggio completo, è possibile reimpostare questo numero solo cancellando e reimpostando il punto di interruzione.
CommandString
Specifica un elenco di comandi da eseguire ogni volta che il punto di interruzione viene rilevato il numero specificato di volte. Questi comandi vengono eseguiti solo se il punto di interruzione viene raggiunto dopo aver eseguito un comando g (Go), anziché dopo un comando t (Trace) o p (Step). I comandi del debugger in CommandString possono includere parametri.
È necessario racchiudere questa stringa di comando tra virgolette e separare più comandi da punto e virgola. È possibile usare caratteri di controllo C standard(ad esempio \n e \"). I punti e virgola contenuti tra virgolette di secondo livello (\") vengono interpretati come parte della stringa racchiusa tra virgolette incorporate.
Il parametro è facoltativo.
Ambiente
Articolo | Descrizione |
---|---|
Modalità | modalità utente, modalità kernel |
Target | solo debug in tempo reale |
Piattaforme | tutto |
Informazioni aggiuntive
Per altre informazioni sui punti di interruzione del processore, vedere Punti di interruzione processore (ba Breakpoints). Per altre informazioni sull'uso di punti di interruzione, altri comandi e metodi di punto di interruzione per controllare i punti di interruzione ed informazioni su come impostare punti di interruzione nello spazio utente da un debugger del kernel, vedere Uso dei punti di interruzione. Per altre informazioni sui punti di interruzione condizionali, vedere Impostazione di un punto di interruzione condizionale.
Osservazioni:
Il debugger usa il numero ID per fare riferimento al punto di interruzione nei comandi bc (Breakpoint Clear), bd (Breakpoint Disable)e be (Breakpoint Enable).
Usare il comando bl (Elenco punti di interruzione) per elencare tutti i punti di interruzione esistenti, i relativi numeri ID e il relativo stato.
Usare il comando bpcmds (Visualizza comandi punto di interruzione) per elencare tutti i punti di interruzione esistenti, i relativi numeri ID e i comandi usati per crearli.
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. In questo esempio, 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 specifiche, consultare il manuale del processore. Per accettare un'istanza specifica, 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.
Non è possibile creare più punti di interruzione del processore con lo stesso indirizzo che differiscono solo nei valori CommandString . Tuttavia, è possibile creare più punti di interruzione con lo stesso indirizzo con restrizioni diverse, ad esempio valori diversi delle opzioni /p, /t, /c e /C .
Per altre informazioni sui punti di interruzione del processore e sulle restrizioni aggiuntive applicabili, vedere Punti di interruzione del processore (ba Breakpoints).
Negli esempi seguenti viene illustrato il comando ba . Il comando seguente imposta un punto di interruzione per l'accesso in lettura su 4 byte della variabile myVar.
0:000> ba r4 myVar
Il comando seguente aggiunge un punto di interruzione in tutte le porte seriali con indirizzi da 0x3F8 a 0x3FB. Questo punto di interruzione viene attivato se qualcosa è letto o scritto in queste porte.
kd> ba i4 3f8