2012-10-10 24 views
12

En el BGF, el comando:GDB - fuente lista de función actual sin tener que teclear su nombre

list function 

una lista de todas la fuente para la función.

¿Hay algún comando que enumere todo el origen de la función en la que se encuentra actualmente, sin que sea necesario que escriba manualmente el nombre de la función?

+2

¿Qué tal solo 'list'? –

+1

imprime varias líneas, pero no toda la función. – s5s

+1

Puede seguir presionando enter luego de 'list function' para repetir el comando anterior y continuar imprimiendo la función 10 líneas a la vez. – Ben

Respuesta

8
(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 que es interesante.

en x86/x64 actual del puntero está en rip registro de modo:

(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 como no tengo nada con la información de depuración a la mano.

+2

Esta identificación no funciona para mí en GDB 7.7: imprimió '10' líneas alrededor de la línea actual, al igual que' list', no toda la función. –

2

gdbtui puede ser útil para ver el origen durante la depuración.

4

Al detenerse en un tipo de función bt de traza. Backtrace mostrará una lista de la pila actual. El elemento en la parte superior, # 0, suele ser la función que le interesa y también se enumera el archivo fuente 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 

Ver http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42 para obtener más información.

También, cuando se establece un punto de interrupción puede especificar comandos que se ejecutará cada vez que se golpea que punto de interrupción. Ver http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35

Por lo tanto, si usted sabe cuántas líneas son en su función podría configurar un comando para listar todas las líneas de código 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 
+0

Un poco tarde para la fiesta, pero claramente es la mejor respuesta. –

1

El comando 'marco' muestra el nombre de la función y la la ubicación de la línea actual y establece la línea actual para la lista a la línea ejecutable actual.

set listsize 17 
frame 
list 

enumera las 8 líneas que rodean la línea actual.

Cuestiones relacionadas