2009-08-30 12 views
32
  1. 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?

  2. 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 di var1 viene modificato, invece che fino al var1 == 0 è vero. Il mio gdb è GNU gdb 6.8-debian.

risposta

3
  1. 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.

  2. 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) 
+0

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

29

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 
+0

Punti eccellenti! Grazie! – Tim

12

È 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.

8

È 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.

+6

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

Problemi correlati