Se si imposta un punto di controllo per una variabile locale sull'ambito corrente, verrà eliminato automaticamente quando si esce dall'ambito. C'è un modo per impostarlo una volta e mantenerlo attivo automaticamente ogni volta che si entra nello stesso scope?Come si impostano i watchpoint permanenti e condizionali sulle variabili con ambito locale?
Esiste comunque un punto di controllo condizionale, ad esempio
watch var1 if var1==0
? Nel mio caso, la condizione non funziona. gdb si interrompe ogni volta che il valore divar1
viene modificato, invece che fino alvar1 == 0
è vero. Il mio gdb è GNU gdb 6.8-debian.
risposta
non sono sicuro che il linguaggio ci stiamo usando, quindi la risposta esatta varia, ma si potrebbe modificare la variabile per essere sia statica, globale, o dinamicamente assegnata (e non lo fanno gratis quando la funzione ritorna?). In questo modo il suo indirizzo non cambierà e gdb sarà in grado di farlo su di esso.
Invece di osservare il valore è uguale a un valore specifico; è necessario impostare un punto di interruzione condizionale sulla riga in cui si desidera verificare il valore di
var1
. Questo dovrebbe effettivamente avere lo stesso effetto
ad es.
(gdb) break main.c:123 if (var1 == 0)
Sono d'accordo con Dave sul fatto che un punto di interruzione condizionale è la strada da percorrere.
Tuttavia, per fare ciò che è stato chiesto, è possibile utilizzare il comando commands
di GDB per impostare un elenco di comandi GDB da eseguire ogni volta che viene colpito un punto di interruzione. Lo trovo incredibilmente utile.
Suggerisco di scrivere i comandi GDB in un file in modo che siano facili da modificare e ricaricare con il comando source
. Oppure puoi specificare i file di comando da caricare sulla riga di comando di GDB o usare .gdbinit per caricarli automaticamente.
Un esempio di un buon uso di commands
:
Supponiamo che ho una funzione format
che viene chiamato da un sacco di altre funzioni. Voglio rompere su di esso, ma solo dopo la funzione do_step_3
è stato chiamato.
break do_step_3
commands
break format
continue
end
È possibile utilizzare questo per il vostro problema con qualcosa di simile:
break func
commands
watch var
continue
end
Punti eccellenti! Grazie! – Tim
È possibile impostare le condizioni sul watchpoints nello stesso modo in cui si fa con i punti di interruzione. Questo è in the documentation ma ammette che difficilmente richiama l'attenzione su di sé.
Quindi watch my_var if my_var > 3
funziona perfettamente, così come il comando condition
.
Per ricreare il punto di controllo se la variabile che sta guardando esce dall'ambito, fare in modo che gdb lo faccia automaticamente utilizzando un punto di interruzione all'inizio della funzione come descritto da Zan.
È possibile impostare un punto di controllo che non rientra nell'ambito di applicazione impostandolo sull'indirizzo di memoria.
(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0
Questo funziona anche per altri tipi di dati e puntatori.
Questo può essere utile, ma non funzionerà qui. Le variabili locali non manterranno lo stesso indirizzo tra le chiamate di funzione, ma è probabile che altre variabili dello stack utilizzino quella posizione di memoria ... – Nick
Sto usando C++. Uso il punto di controllo oltre il punto di interruzione perché potrebbero esserci molti punti nel codice che modificano il valore della variabile. Quindi non è realistico aggiungere punti di interruzione in ogni luogo. Mi piacerebbe vedere se è possibile impostare un punto di controllo condizionale. – Tim