Condividi tramite


bp, bu, bm (Set Breakpoint)

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.

User-Mode

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]

Kernel-Mode

bp[ID] [Options] [Address [Passes]] ["CommandString"] 
bu[ID] [Options] [Address [Passes]] ["CommandString"] 
bm [Options] SymbolPattern [Passes] ["CommandString"]

Parametri

Thread
Specifica il thread a cui si applica il punto di interruzione. Per altre informazioni sulla sintassi, vedere Sintassi 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 del 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 qualsiasi numero 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 dell'espressione numerica.

Opzioni Specifica le opzioni del punto di interruzione. È possibile specificare qualsiasi numero di opzioni seguenti, ad eccezione di quanto indicato:

/1
Crea un punto di interruzione "one-shot". Dopo aver attivato questo punto di interruzione, viene eliminato dall'elenco dei punti di interruzione.

/pEProcess
(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.

/tEThread
(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 /pEProcess e /tEThread, è possibile immetterli in qualsiasi ordine.

/cMaxCallStackDepth
Attiva il punto di interruzione solo quando la profondità dello stack di chiamate è minore di MaxCallStackDepth. Non è possibile usare questa opzione insieme a /C.

/CMinCallStackDepth
Attiva il punto di interruzione solo quando la profondità dello stack di chiamate è maggiore di MinCallStackDepth. Non è possibile usare questa opzione insieme a /c.

/Un
(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 di programma, usare questa opzione solo nei percorsi noti per essere sicuri.

/D
(Solo per il bm ) Converte le posizioni del punto 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 su funzioni di overload con lo stesso nome ma elenchi di parametri diversi. Ad esempio, bm /( myFunc imposta i punti di interruzione in myFunc(int a) e myFunc(char a). Senza "/(", un punto di interruzione impostato su myFunc ha esito negativo perché non indica quale funzione myFunc il punto di interruzione è destinato.

Espressione dell'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 (condizione di corrispondenza – interruzione) o false (non corrisponde alla condizione – non interrompere).

In questo esempio viene impostato un punto di interruzione condizionale in base al valore localVariable.

bp /w "localVariable == 4" mymodule!myfunction

In questo esempio viene illustrato 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 condizionale, 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 Indirizzo, viene usato il puntatore di istruzioni corrente. Per altre informazioni sulla sintassi, vedere Sintassi indirizzo e intervallo di indirizzi.

Passa
Specifica il numero del passaggio di esecuzione attivato dal punto di interruzione. Il debugger ignora il percorso del punto di interruzione finché non raggiunge 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 di 2 attiva il punto di interruzione la seconda volta che viene eseguito il codice.

Questo parametro crea un contatore che viene decrementato in ogni passaggio del codice. Per visualizzare i valori iniziali e correnti del contatore Pass, usare bl (Elenco punti di interruzione).

Il contatore Pass viene decrementato solo quando l'applicazione esegue il punto di interruzione in risposta a un comando g (Go). Il contatore non viene decrementato se si esegue l'esecuzione del codice o la traccia. Quando il contatore Pass raggiunge 1, è possibile reimpostarlo solo cancellando e reimpostando il punto di interruzione.

CommandString
Specifica un elenco di comandi eseguiti ogni volta che il punto di interruzione viene rilevato il numero di volte specificato. È necessario racchiudere il parametro CommandString tra virgolette. Usare punti e virgola per separare più comandi.

I comandi debugger in CommandString possono includere parametri. È possibile usare caratteri C-control standard, ad esempio \n e \". I punti e virgola contenuti nelle virgolette di secondo livello (\") vengono interpretati come parte della stringa con virgolette incorporate.

I comandi CommandString vengono eseguiti solo se il punto di interruzione viene raggiunto mentre l'applicazione viene eseguita in risposta a un comando g (Go). I comandi non vengono eseguiti se si esegue il codice o la 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 corrispondere a questo modello ai simboli esistenti e di impostare i punti di interruzione su tutte le corrispondenze del modello. SymbolPattern può contenere un'ampia gamma di caratteri jolly e identificatori. Per altre informazioni su questa sintassi, vedere Sintassi con caratteri jolly stringa. Poiché questi caratteri vengono corrispondenti ai simboli, la corrispondenza non è distinzione tra maiuscole e minuscole e una singola sottolineatura iniziale (_) rappresenta qualsiasi quantità di caratteri di sottolineatura iniziale.

Ambiente

Elemento Descrizione
Modalità modalità utente, modalità kernel
Targets solo debug live
Piattaforme all

Informazioni aggiuntive

Per altre informazioni su e esempi di come usare punti di interruzione, altri comandi e metodi 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 condizionale, vedere Impostazione di un punto di interruzione condizionale.

Commenti

I comandi bp, bu e bm impostano nuovi punti di interruzione, ma hanno caratteristiche diverse:

  • Il comando bp (Set Breakpoint) imposta un nuovo punto di interruzione all'indirizzo del percorso del punto di interruzione specificato nel comando. Se il debugger non riesce a risolvere l'espressione di 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 (Set Unresolved Breakpoint) imposta un punto di interruzione posticipato o non risolto. Un punto di interruzione bu viene impostato su un riferimento simbolico al percorso del punto di interruzione specificato nel comando (non in un indirizzo) e viene attivato ogni volta che il modulo con il riferimento viene risolto. Per altre informazioni su questi punti di interruzione, vedere Punti di interruzione non risolti (punti di interruzione).

  • Il comando bm (Set Symbol Breakpoint) imposta un nuovo punto di interruzione sui simboli che corrispondono a un modello specificato. Questo comando può creare più punti di interruzione. Per impostazione predefinita, dopo la corrispondenza del modello, i punti di interruzione bm sono uguali ai punti di interruzione bu . Vale a dire, 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 di quale comando è stato usato per impostare un punto di interruzione esistente, usare .bpcmds (Visualizza comandi punti di interruzione) per elencare tutti i punti di interruzione insieme ai comandi usati per crearli.

Esistono tre differenze principali tra punti di interruzionebp 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 il relativo indirizzo cambia.

  • Se un indirizzo bp breakpoint viene trovato in un modulo caricato e, se tale modulo viene scaricato successivamente, il punto di interruzione viene rimosso dall'elenco dei punti di interruzione. D'altra parte, i punti di interruzione bu persisteno dopo lo scaricamento ripetuto e il caricamento.

  • 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 usare caratteri jolly nel modello di simbolo per un punto di interruzione. La sintassi bmSymbolPattern equivale all'uso di x SymbolPattern e quindi l'uso di bu per ogni risultato. Ad esempio, per impostare i 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 dati solo se si è certi che la memoria archiviata in tale posizione verrà usata come codice eseguibile e non come dati del programma. In caso contrario, è consigliabile usare il comando ba (Break on Access). Per altre informazioni, vedere Punti di interruzione del 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 del punto 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 riesce a impostare un punto di interruzione nella posizione richiesta, inserisce il punto di interruzione nella posizione successiva consentita.

Se si specifica Thread, i punti di interruzione vengono impostati nei thread specificati. Ad esempio, il comando ~*bp imposta punti di interruzione su 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 a tale indirizzo (non solo processore 3) causa una trappola del punto di interruzione.

I comandi bp, bu e bm impostano punti di interruzione software sostituendo l'istruzione processore con un'istruzione di interruzione. Per eseguire il debug di codice o codice di sola lettura che non è possibile modificare, usare un comando ba e, in cui e rappresenta l'accesso solo a esecuzione.

Il comando seguente imposta un punto di interruzione 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 nel 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. È possibile usare i comandi con estensione bpcmds (comandi display breakpoint) 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 , la visualizzazione 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 ;