Comandi più complicati / utili per il debugger gdb [chiuso]


138

Puoi pubblicare i tuoi comandi più difficili e utili mentre esegui un debugger come gdb o dbx.


Ho trovato che questa documentazione è buona. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

Risposte:


134
  1. backtrace completo : backtrace completo con variabili locali
  2. su , giù , cornice : consente di spostarsi tra le cornici
  3. watch : sospende il processo quando viene soddisfatta una determinata condizione
  4. imposta stampa piuttosto su : stampa il codice sorgente C formattato in modo grazioso
  5. imposta accesso : registra la sessione di debug da mostrare agli altri per il supporto
  6. imposta matrice di stampa su : Stampa matrice piuttosto
  7. fine : continua fino alla fine della funzione
  8. abilita e disabilita : abilita / disabilita i punti di interruzione
  9. tbreak : interrompi una volta, quindi rimuovi il punto di interruzione
  10. dove : numero di riga attualmente in esecuzione
  11. info locali : visualizza tutte le variabili locali
  12. info args : visualizza tutti gli argomenti delle funzioni
  13. lista : visualizza sorgente
  14. rbreak : break on funzione corrispondente all'espressione regolare

7
info locals- Visualizza tutte le variabili locali; elenco - visualizza sorgente; rbreak - interruzione della funzione corrispondente all'espressione regolare.
Paul Biggar,

source / path / to / macro / file E tutte le mie eleganti macro sono lì per aiutarmi a eseguire il debug in pochi secondi.
Sudhanshu,

1
set print object onper gli elementi polimorfici e set print elements 0sono due comandi che uso molto spesso. Abbastanza utile.
Kiril Kirov,

1
Inoltre, t a a bt(significato thread apply all backtrace). Potrebbe essere usato con (quasi) tutti gli altri comandi. Particolarmente utile con bt full.
Kiril Kirov,

101

Avvia gdb con un'interfaccia utente testuale

gdb -tui

21
Non posso credere che questa funzione mi sia sfuggita per tutti questi anni. Grazie, grazie, grazie!
DevSolar,

Grazie Hai risparmiato molto del mio tempo .. Meraviglioso ....
sujin

1
E un altro: <minus> RET
SullX,

1
oppure usa cgdb
Patryk il

caratteristiche molto belle. Perso questo finora ...
PraveenMax

45

A partire da gdb 7.0, c'è il debug reversibile , quindi i tuoi nuovi comandi preferiti sono:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.

21

Invece di avviare GDB con il parametro "-tui" puoi anche passare alla modalità testo dopo un po 'usando digitando "wh".


3
Ctrl-a a per tornare alla visualizzazione della riga di comando "normale"!
Kevin,

2
"- 'può essere usato instabile di' wh '. più breve è meglio .. :)
raj_gt1

6
Ctrl-a a? È uno scherzo? Sembra più tmux/ screencomando. E non funziona per me. Deve essere uno dei come per documenti : C-x C-a, C-x a, C-x A.
x-yuri,

In realtà lo è C-x a. Puoi anche cambiare vista con C-x 1e C-x 2quando sei in modalità tui per vedere anche l'assemblaggio (se necessario).
Sam Whitlock,

16

thread apply all btoppure thread apply all print $pc: per scoprire rapidamente cosa stanno facendo tutti i thread.


Questo era il comando che stavo cercando da molto tempo! È davvero brutto controllare tutti i 30 thread uno per uno!
tothphu,


6

Utilizzo -command=<file with gdb commands>dell'opzione durante l'avvio di gdb. Come -x <command file>. Questo file di comandi può contenere comandi gdb come punti di interruzione, opzioni, ecc. Utile nel caso in cui un particolare eseguibile debba essere sottoposto a successive esecuzioni di debug usando gdb.


Puoi anche usare l' -iexopzione per aggiungere singoli comandi sulla riga di comando di gdb.
doug65536,

5

lo scripting gdb è un buon trucco, a parte quello che mi piace attivare / disattivare il blocco dello scheduler per impedire l'esecuzione di altri thread quando ne fai uno.


1
Come si imposta il blocco dello scheduler?
deft_code

3
set scheduler-locking ondentro gdb
Ben

come si imposta come predefinito? L'ho provato .gdbinit ma gdb stampa /home/omry/.gdbinit:1: errore nel file dei comandi di origine: la destinazione "Nessuno" non può supportare questo comando.
Omry Yadan

4
  • Utilizzando .gdbinit (file di avvio in cui è possibile scrivere macro e chiamare da gdb). Posiziona .gdbinit nella tua home directory in modo che venga prelevato ogni volta che viene caricato gdb
  • thread di informazioni per elencare tutti i thread attivi ef (#) -> # numero di thread a cui si desidera passare

  • a volte uso gdb per convertire da esadecimale a decimale o binario, è molto utile invece di aprire una calcolatrice

    • p / d 0x10 -> fornisce l'equivalente decimale di 0x10
    • p / t 0x10 -> equivalente binario di 0x10
    • p / x 256 -> equivalente esadecimale di 256

4

Invece di avviare gdb con l'opzione -tui per vedere un processo figlio che contiene una schermata che evidenzia dove si trova la riga di codice in esecuzione nel tuo programma, salta dentro e fuori da questa funzione con Cx o e Cx a. Questo è utile se stai usando la funzione e cosa non usare temporaneamente in modo da poter usare la freccia su per ottenere un comando precedente.


2
puoi cambiare lo stato focus cmdattivo nella finestra di comando usando in modo che le frecce su / giù funzionino. Si torna indietro usando focus src.
Nathan Fellman,

3

Questo può essere utile, sono sicuro che potrebbe essere migliorato però, aiuta a dare il benvenuto:

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.