bp, bu, bm (Imposta punto di interruzione)
I comandi bp, bu e bm impostano uno o più punti di interruzione software. È possibile combinare posizioni, condizioni e opzioni per impostare diversi tipi di punti di interruzione software.
Modalità utente
[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"]
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"]
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]
Modalità kernel
bp[ID] [Options] [Address [Passes]] ["CommandString"]
bu[ID] [Options] [Address [Passes]] ["CommandString"]
bm [Options] SymbolPattern [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. Se non si specifica un thread, il punto di interruzione si applica a tutti i thread.
ID
Specifica un numero decimale che identifica un punto di interruzione.
Il debugger assegna l'ID quando crea il punto di interruzione, ma è possibile modificarlo usando il comando br (Renumber punto di interruzione). È possibile usare l'ID per fare riferimento al punto di interruzione nei comandi del debugger successivi. Per visualizzare l'ID di un punto di interruzione, usare il comando bl (Elenco punti di interruzione).
Quando si usa l'ID in un comando, non digitare uno spazio tra il comando (bp o bu) e il numero ID.
Il parametro ID è sempre facoltativo. Se non si specifica l'ID, il debugger usa il primo numero di punto di interruzione disponibile. In modalità kernel è possibile impostare solo 32 punti di interruzione. In modalità utente è possibile impostare un numero qualsiasi di punti di interruzione. In entrambi i casi, 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.
Opzioni Specifica le opzioni del punto di interruzione. È possibile specificare 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, viene eliminato dall'elenco dei punti di interruzione.
/p EProcess
(solo in 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 in 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 qualsiasi ordine.
/c MaxCallStackDepth
Attiva il punto di interruzione solo quando la profondità dello stack di chiamate è minore di MaxCallStackDepth. Non è possibile usare questa opzione insieme a /C.
/C MinCallStackDepth
Attiva il punto di interruzione solo quando la profondità dello stack di chiamate è maggiore di MinCallStackDepth. Non è possibile usare questa opzione insieme a /c.
/a
(Solo per il bm ) Imposta i punti di interruzione in tutte le posizioni specificate, indipendentemente dal fatto che si trovino nello spazio dati o nello spazio del codice. Poiché i punti di interruzione nei dati possono causare errori del programma, usare questa opzione solo nei percorsi noti per essere sicuri.
/d
(Solo per bm ) Converte i percorsi dei punti di interruzione in indirizzi. Pertanto, se il codice viene spostato, i punti di interruzione rimangono allo stesso indirizzo, anziché essere impostati in base a SymbolPattern. Usare /d per evitare di rivalutare le modifiche ai punti di interruzione quando i moduli vengono caricati o scaricati.
/(
(Solo per il bm ) Include le informazioni sull'elenco dei parametri nella stringa di simboli definita da SymbolString .
Questa funzionalità consente di impostare punti di interruzione in funzioni di overload con lo stesso nome ma elenchi di parametri diversi. Ad esempio, bm /( myFunc imposta i punti di interruzione sia su myFunc(int a) che su myFunc(char a). Senza "/(", un punto di interruzione impostato su myFunc ha esito negativo perché non indica quale funzione myFunc è destinata al punto di interruzione.
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 di localVariable.
bp /w "localVariable == 4" mymodule!myfunction
Questo esempio illustra come impostare un punto di interruzione usando JavaScript.
bp /w "@$scriptContents.myFunc(localVariable)" @rip
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 il primo byte dell'istruzione in cui è impostato il punto di interruzione. 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 del passaggio di esecuzione su cui è attivato il punto di interruzione. Il debugger ignora la posizione del punto di interruzione fino a raggiungere il passaggio specificato. Il valore di Pass può essere qualsiasi valore a 16 bit o a 32 bit.
Per impostazione predefinita, il punto di interruzione è attivo la prima volta che l'applicazione esegue il codice che contiene il percorso del punto di interruzione. Questa situazione predefinita equivale a un valore pari a 1 per Pass. Per attivare il punto di interruzione solo dopo che l'applicazione esegue il codice almeno una volta, immettere un valore pari a 2 o più. Ad esempio, un valore pari a 2 attiva il punto di interruzione la seconda volta che viene eseguito il codice.
Questo parametro crea un contatore decrementato in ogni passaggio del codice. Per visualizzare i valori iniziali e correnti del contatore Pass, utilizzare bl (Elenco punti di interruzione).
Il contatore Passa viene decrementato solo quando l'applicazione esegue oltre il punto di interruzione in risposta a un comando g (Go). Il contatore non viene decrementato se si esegue l'esecuzione del codice o se si esegue la traccia oltre. Quando il contatore Passa raggiunge 1, è possibile reimpostarlo solo cancellando e reimpostando il punto di interruzione.
CommandString
Specifica un elenco di comandi eseguiti ogni volta che viene rilevato il numero specificato di punti di interruzione. È necessario racchiudere il parametro CommandString tra virgolette. Usare i punti e virgola per separare più comandi.
I comandi del debugger in CommandString possono includere parametri. È 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.
I comandi CommandString vengono eseguiti solo se viene raggiunto il punto di interruzione mentre l'applicazione viene eseguita in risposta a un comando g (Go). I comandi non vengono eseguiti se si esegue l'esecuzione del codice o della traccia oltre questo punto.
Qualsiasi comando che riprende l'esecuzione del programma dopo un punto di interruzione (ad esempio g o t) termina l'esecuzione dell'elenco di comandi.
SymbolPattern
Specifica un modello. Il debugger tenta di associare questo modello ai simboli esistenti e di impostare punti di interruzione in tutte le corrispondenze dei criteri. SymbolPattern può contenere un'ampia gamma di caratteri jolly e identificatori. Per altre informazioni su questa sintassi, vedere Sintassi stringhe con caratteri jolly. Poiché questi caratteri vengono confrontati con i simboli, la corrispondenza non fa distinzione tra maiuscole e minuscole e un singolo carattere di sottolineatura iniziale (_) rappresenta qualsiasi quantità di caratteri di sottolineatura iniziali.
Ambiente
Articolo | Descrizione |
---|---|
Modalità | modalità utente, modalità kernel |
Target | solo debug in tempo reale |
Piattaforme | tutto |
Informazioni aggiuntive
Per altre informazioni su e esempi su come usare punti di interruzione, altri comandi e metodi di punto di interruzione per controllare i punti di interruzione e come impostare punti di interruzione nello spazio utente da un debugger del kernel, vedere Uso di punti di interruzione. Per altre informazioni sui punti di interruzione condizionali, vedere Impostazione di un punto di interruzione condizionale.
Osservazioni:
I comandi bp, bu e bm impostano nuovi punti di interruzione, ma hanno caratteristiche diverse:
Il comando bp (Imposta punto di interruzione) imposta un nuovo punto di interruzione nell'indirizzo del percorso del punto di interruzione specificato nel comando. Se il debugger non riesce a risolvere l'espressione dell'indirizzo della posizione del punto di interruzione quando viene impostato il punto di interruzione, il punto di interruzione bp viene convertito automaticamente in un punto di interruzione bu . Usare un comando bp per creare un punto di interruzione che non è più attivo se il modulo viene scaricato.
Il comando bu (Imposta punto di interruzione non risolto) imposta un punto di interruzione posticipato o non risolto. Un punto di interruzione bu viene impostato su un riferimento simbolico alla posizione del punto di interruzione specificata nel comando (non in un indirizzo) e viene attivata ogni volta che il modulo con il riferimento viene risolto. Per altre informazioni su questi punti di interruzione, vedere Punti di interruzione non risolti (bu Breakpoints).For more information about these breakpoints, see Unresolved Breakpoints (bu Breakpoints).
Il comando bm (Imposta punto di interruzione simboli) imposta un nuovo punto di interruzione sui simboli che corrispondono a un criterio specificato. Questo comando può creare più punti di interruzione. Per impostazione predefinita, dopo la corrispondenza del criterio, i punti di interruzione bm corrispondono ai punti di interruzione bu . Ovvero, i punti di interruzione bm sono punti di interruzione posticipati impostati su un riferimento simbolico. Tuttavia, un comando bm /d crea uno o più punti di interruzione bp . Ogni punto di interruzione viene impostato sull'indirizzo di una posizione corrispondente e non tiene traccia dello stato del modulo.
Se non si è certi del comando usato per impostare un punto di interruzione esistente, usare bpcmds (Visualizza comandi punto di interruzione) per elencare tutti i punti di interruzione insieme ai comandi usati per crearli.
Esistono tre differenze principali tra punti di interruzione bp e punti di interruzione bu :
Una posizione del punto di interruzione bp viene sempre convertita in un indirizzo. Se una modifica del modulo sposta il codice in corrispondenza del quale è stato impostato un punto di interruzione bp , il punto di interruzione rimane allo stesso indirizzo. D'altra parte, un punto di interruzione bu rimane associato al valore simbolico (in genere un simbolo più un offset) usato e tiene traccia di questa posizione simbolica anche se l'indirizzo cambia.
Se un indirizzo del punto di interruzione bp viene trovato in un modulo caricato e se tale modulo viene scaricato in un secondo momento, il punto di interruzione viene rimosso dall'elenco dei punti di interruzione. D'altra parte, i punti di interruzione vengono mantenuti dopo lo scaricamento e il caricamento ripetuti.
I punti di interruzione impostati con bp non vengono salvati nelle aree di lavoro WinDbg. I punti di interruzione impostati con bu vengono salvati nelle aree di lavoro.
Il comando bm è utile quando si desidera utilizzare caratteri jolly nel modello di simboli per un punto di interruzione. La sintassi bm SymbolPattern equivale all'uso di x SymbolPattern e quindi all'uso di bu per ogni risultato. Ad esempio, per impostare punti di interruzione su tutti i simboli nel modulo Myprogram che iniziano con la stringa "mem", usare il comando seguente.
Esempio
0:000> bm myprogram!mem*
4: 0040d070 MyProgram!memcpy
5: 0040c560 MyProgram!memmove
6: 00408960 MyProgram!memset
Poiché il comando bm imposta punti di interruzione software (non punti di interruzione del processore), esclude automaticamente la posizione dei dati quando imposta i punti di interruzione per evitare di danneggiare i dati.
È 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. Se un punto di interruzione software viene inserito nei dati del programma anziché nel codice eseguibile, può causare il danneggiamento dei dati. È pertanto consigliabile usare questi comandi in un percorso di dati solo se si è certi che la memoria archiviata in tale percorso verrà usata come codice eseguibile e non come dati del programma. In caso contrario, è consigliabile usare il comando ba (Interrompi in accesso). Per altre informazioni, vedere Punti di interruzione processore (ba Breakpoints).
Per informazioni dettagliate su come impostare un punto di interruzione in una posizione specificata da una sintassi più complessa, ad esempio un membro di una classe pubblica C++ o una stringa di testo arbitraria contenente caratteri altrimenti limitati, vedere Sintassi dei punti di interruzione.
Se una singola riga di origine logica si estende su più righe fisiche, il punto di interruzione viene impostato sull'ultima riga fisica dell'istruzione o della chiamata. Se il debugger non può impostare un punto di interruzione nella posizione richiesta, inserisce il punto di interruzione nella posizione consentita successiva.
Se si specifica Thread, i punti di interruzione vengono impostati nei thread specificati. Ad esempio, il comando ~*bp imposta i punti di interruzione in tutti i thread, ~#bp imposta un punto di interruzione nel thread che causa l'eccezione corrente e ~123bp imposta un punto di interruzione nel thread 123. I comandi ~bp e ~.bp impostano entrambi un punto di interruzione nel thread corrente.
Quando si esegue il debug di un sistema multiprocessore in modalità kernel, i punti di interruzione impostati usando bp o ba (Break on Access) si applicano a tutti i processori. Ad esempio, se il processore corrente è 3 e si digita bp MemoryAddress per inserire un punto di interruzione in MemoryAddress. Qualsiasi processore in esecuzione in tale indirizzo (non solo processore 3) causa un trap del punto di interruzione.
I comandi bp, bu e bm impostano punti di interruzione software sostituendo l'istruzione del processore con un'istruzione di interruzione. Per eseguire il debug del codice di sola lettura o del codice che non può essere modificato, usare un comando ba e, dove e rappresenta l'accesso di sola esecuzione.
Il comando seguente imposta un punto di interruzione di 12 byte oltre l'inizio della funzione MyTest. Questo punto di interruzione viene ignorato per i primi sei passa attraverso il codice, ma l'esecuzione si arresta al settimo passaggio del codice.
0:000> bp MyTest+0xb 7
Il comando seguente imposta un punto di interruzione in RtlRaiseException, visualizza il registro eax , visualizza il valore del simbolo MyVar e continua.
kd> bp ntdll!RtlRaiseException "r eax; dt MyVar; g"
I due comandi bm seguenti impostano tre punti di interruzione. Quando vengono eseguiti i comandi, il risultato visualizzato non distingue tra i punti di interruzione creati con l'opzione /d e quelli creati senza di esso. I comandi con estensione bpcmds (visualizza i comandi del punto di interruzione) possono essere usati per distinguere tra questi due tipi. Se il punto di interruzione è stato creato da bm senza l'opzione /d , la visualizzazione con estensione bpcmds indica il tipo di punto di interruzione come bu, seguito dal simbolo valutato racchiuso nel token @!"" (che indica che è un simbolo letterale e non un'espressione numerica o un registro). Se il punto di interruzione è stato creato da bm con l'opzione /d , il valore con estensione bpcmds indica il tipo di punto di interruzione come bp.
0:000> bm myprog!openf*
0: 00421200 @!"myprog!openFile"
1: 00427800 @!"myprog!openFilter"
0:000> bm /d myprog!closef*
2: 00421600 @!"myprog!closeFile"
0:000> .bpcmds
bu0 @!"myprog!openFile";
bu1 @!"myprog!openFilter";
bp2 0x00421600 ;