gdbtui puede ser útil para ver la fuente durante la depuración.
Cuando te detengas en una función, escribe bt para backtrace.Backtrace enumerará la pila actual. El elemento en la parte superior, #0, suele ser la función que le interesa y también se enumeran el archivo de origen y el número de línea.
Por ejemplo:
(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
Consulte http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42 para obtener más información.
Además, cuando establece un punto de interrupción, puede especificar comandos que se ejecutará cada vez que llegue a ese punto de interrupción. Consulte http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35
Entonces, si sabe cuántas líneas hay en su función, puede configurar un comando para enumerar todas las líneas fuente de la función:
(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.
El *ADDRESS
es lo interesante.
En x86/x64, el puntero actual está en rip
regístrate así:
(gdb) list *$pc
0x7ffff7b018a0 is at ../sysdeps/unix/syscall-template.S:82.
77 in ../sysdeps/unix/syscall-template.S
El ejemplo es de cat
comando ya que no tengo nada con información de depuración a mano.
El comando 'marco' muestra el nombre de la función y la ubicación de la línea actual y establece la línea actual para la lista en la línea ejecutable actual.
set listsize 17
frame
list
enumera las 8 líneas que rodean la línea actual.