GNU/Linux >> Tutoriales Linux >  >> Linux

gdb:enumera la fuente de la función actual sin escribir su nombre

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.


Linux
  1. ¿Eliminar todos los archivos en un directorio cuyo nombre no coincide con una línea en una lista de archivos?

  2. ¿Por qué no funciona el autocompletado cuando se escribe un nombre de comando después de `fuente`?

  3. Obtener una lista de nombres de funciones en un script de shell

  4. Historial de bash sin números de línea

  5. LISTA de directorios sin barra inclinada /

[Consejos de Bash] Cambiar el nombre de los archivos sin escribir el nombre completo dos veces en Linux

Cómo encontrar el nombre del proceso a partir de su PID

GDB no cargará el archivo fuente

Probando nginx sin nombre de dominio

¿Cómo enumero los procesos en htop solo por su nombre, sin la ruta completa?

Establecer el nombre del remitente en la función de correo