GNU/Linux >> LINUX-Kenntnisse >  >> Linux

gdb - listet die Quelle der aktuellen Funktion auf, ohne ihren Namen einzugeben

gdbtui kann nützlich sein, um die Quelle während des Debuggens anzuzeigen.


Wenn Sie in einer Funktion angehalten werden, geben Sie bt ein for backtrace.Backtrace listet den aktuellen Stack auf. Das Element ganz oben, #0, ist normalerweise die Funktion, an der Sie interessiert sind, und die Quelldatei und die Zeilennummer werden ebenfalls aufgelistet.

Zum Beispiel:

(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

Weitere Informationen finden Sie unter http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42.

Außerdem können Sie beim Festlegen eines Haltepunkts Befehle angeben das wird jedes Mal ausgeführt, wenn Sie diesen Haltepunkt erreichen. Siehe http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35

Wenn Sie also wissen, wie viele Zeilen Ihre Funktion hat, können Sie einen Befehl setzen, um alle Quellzeilen der Funktion aufzulisten:

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

Der *ADDRESS ist das Interessante.

Auf x86/x64 befindet sich der aktuelle Zeiger in rip Registrieren Sie sich so:

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

Das Beispiel stammt aus cat Befehl, da ich nichts mit Debug-Informationen zur Hand habe.


Der Befehl 'frame' zeigt den Funktionsnamen und die aktuelle Zeilenposition und setzt die aktuelle Zeile für die Liste auf die aktuelle ausführbare Zeile.

set listsize 17
frame
list

listet die 8 Zeilen auf, die die aktuelle Zeile umgeben.


Linux
  1. 11 Linux-Befehlszeilenhandbücher, auf die Sie nicht verzichten sollten

  2. Warum funktioniert die automatische Vervollständigung nicht, wenn ein Befehlsname nach „Quelle“ eingegeben wird?

  3. kann kein Skript in einem aktuellen Verzeichnis beziehen

  4. grep ohne Pfad/Datei:Zeile anzuzeigen

  5. GDB lädt die Quelldatei nicht

[Bash-Tipps] Dateien umbenennen, ohne zweimal den vollständigen Namen in Linux einzugeben

So finden Sie den Prozessnamen anhand seiner PID

Holen Sie sich eine Liste von Funktionsnamen in einem Shell-Skript

Bash-Verlauf ohne Zeilennummern

Liste der Verzeichnisse ohne nachgestellten Schrägstrich /

Wie liste ich Prozesse in htop nur nach ihrem Namen auf, ohne den vollständigen Pfad?