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.