debugging - gdb: cómo imprimir la línea actual o encontrar el número de línea actual?
gcc (4)
list
comandos de list
imprimen un conjunto de líneas, pero necesito una sola línea, donde estoy y donde probablemente haya ocurrido un error.
Comando donde se puede usar frame . donde comando dará más información con el nombre de la función
El comando ''marco'' le dará lo que está buscando. (Esto se puede abreviar solo ''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'' simplemente te dice dónde estás (con un argumento cambia el cuadro). Puede encontrar más información sobre el comando frame here .
Obtengo la misma información durante la depuración. Aunque no mientras estoy revisando el stacktrace. Lo más probable es que hubieras usado la bandera de optimización, creo. Mira este link - algo relacionado.
Intente compilar con -g3
eliminar cualquier indicador de optimización. Entonces podría funcionar. HTH!
Tenga en cuenta que gdb es un poderoso comando -capaz de instrucciones de bajo nivel- por lo que está ligado a los conceptos de ensamblaje.
Lo que está buscando se llama puntero de instrucción, es decir:
El registro del 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 ripeo en modo de 64 bits.
más detalles here
todos los registros disponibles en la ejecución de gdb se pueden mostrar con:
(gdb) info registers
con él puedes encontrar qué modo está ejecutando tu programa (buscando cuáles de estos registros existen)
luego (aquí usando la extracción de registro más común hoy en día, reemplace con eip o muy raramente con 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.