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
- 1. È possibile impostare i watchpoint sulle proprietà Swift?
- 2. Come si impostano i predicati NSExtensionActivationRule?
- 3. Costanti PHP con ambito locale
- 4. Come si impostano i browser remoti in Karma?
- 5. Variabili con ambito dell'istruzione if
- 6. Impostazione del watchpoint hardware GDB/come impostare il software watchpoint
- 7. Variabili condizionali stack
- 8. Magento: come rimuovere tutti i reindirizzamenti permanenti
- 9. Espressioni SSIS che impostano due variabili
- 10. Come si impostano i formattatori Mongo personalizzati in primavera?
- 11. Git: come mantenere i rami paralleli permanenti
- 12. Come rendere i volumi permanenti con Docker Compose v2
- 13. Ambito delle variabili in istruzioni if
- 14. variabili locali nelle definizioni di classe/ambito
- 15. Ambito locale JavaScript: var rispetto a questo
- 16. Non capisco rubino ambito locale
- 17. ambito locale in un'istruzione switch - dove si interrompe?
- 18. Come si impostano le variabili di ambiente su Cloud Foundry v2?
- 19. Le sessioni PHP impostano i cookie?
- 20. Come mantenere i commenti sulle variabili impostate tramite "M-x customize" su emacs?
- 21. preprocessore CSS con moduli e ambito sano?
- 22. comprensione globale e locale Ambito di applicazione in Javascript
- 23. Prefisso di sottolineatura sulle variabili membro. intellisense
- 24. sessione Angularjstoret e ambito
- 25. Che cos'è uno spettrogramma e come si impostano i suoi parametri?
- 26. Considerazioni sulle prestazioni per condizionali query di ricerca (forme)
- 27. Utilizzo di MIddleman 3.0 - Come si impostano i singoli titoli di pagina nelle pagine dinamiche?
- 28. Angular2, * ngIf e dei modelli locale variabili
- 29. Variabili SASS impostate all'interno di condizionali?
- 30. Perché non sono le variabili macro SAS Ambito locale per impostazione predefinita?
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