gdb: ¿cómo imprimir la línea actual o encontrar el número de línea actual?

94

list Los comandos imprimen un conjunto de líneas, pero necesito una sola línea, donde estoy y donde probablemente haya ocurrido un error.

Boris Burkov
fuente
23
backtraceo where, incluso info lineo simplemente bt(para retroceso). dirac.org/linux/gdb para un tutorial de gdb
dwalter
bto backtraceo whereimprimir pila de llamadas a funciones, fo frameimprimir siguiente línea a ejecutar.
Eric Wang

Respuestas:

21

Obtengo la misma información mientras depuro. Aunque no mientras reviso el seguimiento de la pila. Lo más probable es que hayas usado la bandera de optimización, creo. Consulte este enlace , algo relacionado.

Intente compilar con -g3eliminar cualquier indicador de optimización. Entonces podría funcionar. HTH!

kumar_m_kiran
fuente
1
Ah, entonces, aunque mi programa fue compilado -gpara contener información de depuración, actualmente estoy en un marco de pila, tomado de una de las bibliotecas compartidas, que aparentemente no se compiló para contener información de línea. Gracias, kumar.
Boris Burkov
104

El comando 'marco' le dará lo que está buscando. (Esto se puede abreviar simplemente 'f'). Aquí hay un ejemplo:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

Sin un argumento, 'frame' solo le dice dónde se encuentra (con un argumento cambia el marco). Puede encontrar más información sobre el comando frame aquí .

usuario3162307
fuente
21

Tenga en cuenta que gdb es un comando poderoso, capaz de instrucciones de bajo nivel, por lo que está vinculado a conceptos de ensamblaje.

Lo que está buscando se llama puntero de instrucción, es decir:

El registro de puntero de instrucción apunta a la dirección de memoria que el procesador intentará ejecutar a continuación. El puntero de instrucción se llama ip en modo de 16 bits, eip en modo de 32 bits y rip en modo de 64 bits.

más detalles aquí

todos los registros disponibles en la ejecución de gdb se pueden mostrar con:

(gdb) info registers

con él puede encontrar en qué modo se está ejecutando su programa (buscando cuáles de estos registros existen)

entonces (aquí usando el rip de registro más común hoy en día, reemplácelo con eip o muy raramente ip si es necesario):

(gdb)info line *$rip

le mostrará el número de línea y la fuente del archivo

(gdb) list *$rip

le mostrará esa línea con algunos antes y después

pero probablemente

(gdb) frame

debería ser suficiente en muchos casos.

albfan
fuente
2
GDB no admite el modo de 16 bits, creo, por iplo que nunca se usa aquí. Además, en lugar de la ortografía de forma explícita el nombre del contador de programa, puede utilizar el alias de GDB para ello: $pc. Así x/10i $pcque desensamblará 10 instrucciones en el puntero de instrucción actual independientemente de la arquitectura; funcionará en i386, x86_64, ARM, etc.
Ruslan
18

Comando dónde se puede usar o marco . donde el comando dará más información con el nombre de la función

pravu pp
fuente
2

Todas las respuestas anteriores son correctas, lo que prefiero es usar el modo tui (ctrl + XA) que muestra su ubicación y la función en una ventana separada que es muy útil para los usuarios. Espero que eso también ayude.

Mazhar MIK
fuente