GNU/Linux >> Linux Esercitazione >  >> Linux

gdb - elenca la fonte della funzione corrente senza digitarne il nome

gdbtui può essere utile per visualizzare il sorgente durante il debug.


Quando vieni fermato in una funzione digita bt per backtrace.Backtrace elencherà lo stack corrente. L'elemento in alto, #0, di solito è la funzione che ti interessa e sono elencati anche il file sorgente e il numero di riga.

Ad esempio:

(gdb) bt
#0  myClass::EntityTypeStruct::readAttributes (this=0x7fffd00066e0, buf=0x7fffd0006020 "", len=48)
    at /team/project/src/EntityTypeStruct.cc:55
#1  0x000000000044ca86 in workerThread (ts=0x7fffea71dcc0)
    at /team/project/src/threads/workerThread.cc:219
#2  0x00007ffff775e9d1 in start_thread () from /lib64/libpthread.so.0
#3  0x00007ffff6c07b5d in clone () from /lib64/libc.so.6

Vedi http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42 per maggiori informazioni.

Inoltre, quando imposti un punto di interruzione puoi specificare comandi che verrà eseguito ogni volta che raggiungi quel punto di interruzione. Vedi http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35

Quindi, se sai quante righe ci sono nella tua funzione, puoi impostare un comando per elencare tutte le righe sorgente della funzione:

(gdb) break myClass::EntityTypeStruct::readAttributes
Breakpoint 1 at 0x61ec3b: file /team/project/src/EntityTypeStruct.cc, line 38.
(gdb) commands 1
list 38,104
end

(gdb) help list
List specified function or line.
With no argument, lists ten more lines after or around previous listing.
"list -" lists the ten lines before a previous ten-line listing.
One argument specifies a line, and ten lines are listed around that line.
Two arguments with comma between specify starting and ending lines to list.
Lines can be specified in these ways:
  LINENUM, to list around that line in current file,
  FILE:LINENUM, to list around that line in that file,
  FUNCTION, to list around beginning of that function,
  FILE:FUNCTION, to distinguish among like-named static functions.
  *ADDRESS, to list around the line containing that address.
With two args if one is empty it stands for ten lines away from the other arg.

Il *ADDRESS è ciò che è interessante.

Su x86/x64 il puntatore corrente è in rip registrati così:

(gdb) list *$pc
0x7ffff7b018a0 is at ../sysdeps/unix/syscall-template.S:82.
77  in ../sysdeps/unix/syscall-template.S

L'esempio è da cat comando poiché non ho nulla con le informazioni di debug a portata di mano.


Il comando 'frame' mostra il nome della funzione e la posizione della riga corrente e imposta la riga corrente per list sulla riga eseguibile corrente.

set listsize 17
frame
list

elenca le 8 righe che circondano la riga corrente.


Linux
  1. 11 guide della riga di comando di Linux di cui non dovresti fare a meno

  2. Mettere il comando della cronologia sulla riga di comando senza eseguirlo?

  3. Perché il completamento automatico non funziona quando si digita un nome di comando dopo "source"?

  4. Cancella l'attuale riga della console stampata

  5. Ottieni un elenco di nomi di funzioni in uno script di shell

[Suggerimenti Bash] Rinomina i file senza digitare il nome completo due volte in Linux

Il prompt del terminale sovrascrive la linea corrente?

Eliminare tutti i file in una directory il cui nome non corrisponde a una riga in un elenco di file?

Come trovare il nome del processo dal suo PID

Testare nginx senza nome di dominio

Umask corrente di un processo con <pid>