GNU/Linux >> Znalost Linux >  >> Linux

gdb - seznam zdrojů aktuální funkce bez zadání jejího názvu

gdbtui může být užitečné pro zobrazení zdroje během ladění.


Když jste zastaveni ve funkci, zadejte bt for backtrace.Backtrace vypíše aktuální zásobník. Prvek nahoře, #0, je obvykle funkce, která vás zajímá, a je zde také uveden zdrojový soubor a číslo řádku.

Například:

(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

Více informací naleznete na http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42.

Když nastavíte bod přerušení, můžete také zadat příkazy který se spustí pokaždé, když dosáhnete tohoto bodu přerušení. Viz http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35

Pokud tedy víte, kolik řádků je ve vaší funkci, můžete nastavit příkaz, který vypíše všechny zdrojové řádky funkce:

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

*ADDRESS je to zajímavé.

Na x86/x64 je aktuální ukazatel v rip zaregistrujte se takto:

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

Příklad je z cat příkaz, protože nemám po ruce nic s informacemi o ladění.


Příkaz 'frame' zobrazuje název funkce a aktuální umístění řádku a nastavuje aktuální řádek seznamu na řádek aktuálního spustitelného souboru.

set listsize 17
frame
list

uvádí 8 řádků obklopujících aktuální řádek.


Linux
  1. Vymazat aktuální vytištěný řádek konzoly

  2. Získejte seznam názvů funkcí ve skriptu shellu

  3. SEZNAM adresářů bez koncového lomítka /

  1. Testování nginx bez názvu domény

  2. Nastavte jméno odesílatele ve funkci pošty

  3. Aktuální umask procesu s <pid>

  1. Vložit příkaz Historie do příkazového řádku, aniž byste jej provedli?

  2. Historie Bash bez čísel řádků

  3. nemůže zdrojový skript v aktuálním adresáři