linux - gdb se detiene en un archivo de comando si hay un error. ¿Cómo continuar a pesar del error?
coredump (4)
No creo que eso sea posible ya que la ejecución se basa en el puntero. Sin embargo, lo que podría hacer es asignar un nuevo valor al puntero cuando set yourPointer = <another object of the same type>
ese error, por ejemplo, set yourPointer = <another object of the same type>
. Su programa puede usar el valor desreferenciado para continuar.
Mi script gdb real al analizar un archivo core, intento desreferenciar un puntero y obtener "Error en el archivo de comando de origen: no puedo acceder a la memoria en la dirección" y luego se detiene mi script gdb. Lo que quiero es solo seguir ejecutando mi script gdb sin parar. ¿Es posible?
Este es un programa de prueba y un script gdb de prueba que demuestra mi problema. En esta situación, el puntero tiene valor NULL, pero en una situación real, el puntero no tendrá un valor inválido nulo.
Este es el programa de prueba C:
#include <stdio.h>
struct my_struct {
int v1;
int v2;
};
int main()
{
my_struct *p;
printf("%d %d/n", p->v1, p->v2);
return 0;
}
Este es un script test gdb:
>cat analyze.gdb
p p->v1
q
Y esta es una demostración del problema (lo que quiero de gdb aquí es obtener este mensaje de error y luego ir al comando de quit
proceso):
>gdb -silent a.out ./core.22384 -x ./analyze.gdb
Reading symbols from /a.out...done.
[New Thread 22384]
Core was generated by `./a.out''.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400598 in main () at main.cpp:11
11 printf("%d %d/n", p->v1, p->v2);
./analyze.gdb:1: Error in sourced command file:
Cannot access memory at address 0x0
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.x86_64
Actualizar
Gracias a Tom. Este es un script gdb que maneja este problema:
>cat ./analyze.v2.gdb
python
def my_ignore_errors(arg):
try:
gdb.execute("print /"" + "Executing command: " + arg + "/"")
gdb.execute (arg)
except:
gdb.execute("print /"" + "ERROR: " + arg + "/"")
pass
my_ignore_errors("p p")
my_ignore_errors("p p->v1")
gdb.execute("quit")
Así es como funciona:
>gdb -silent ./a.out -x ./analyze.v2.gdb -c ./core.15045
Reading symbols from /import/home/a.out...done.
[New Thread 15045]
Core was generated by `./a.out''.
Program terminated with signal 11, Segmentation fault.
#0 0x0000000000400598 in main () at main.cpp:11
11 printf("%d %d/n", p->v1, p->v2);
$1 = "Executing command: p p"
$2 = (my_struct *) 0x0
$3 = "Executing command: p p->v1"
$4 = "ERROR: p p->v1"
$5 = "Executing command: quit"
El lenguaje de comandos de gdb no tiene forma de ignorar un error al procesar un comando.
Esto se hace fácilmente, sin embargo, si su gdb se construyó con la extensión de Python. Busque el script "ignorar errores". Con eso, puedes:
(gdb) ignorar-errores imprimir * foo
... y se mostrarán los errores de impresión, pero no abortará el resto de la secuencia de comandos.
También puedes hacer esto:
gdb a.out < analyze.v2.gdb
Esto ejecutará los comandos en analyze.v2.gdb línea por línea, incluso si ocurre un error.
Si solo desea salir si ocurre algún error, puede usar la opción -batch
gdb :
Ejecutar en modo por lotes. Salga con el estado
0
después de procesar todos los archivos de comando especificados con ''-x
'' (y todos los comandos de los archivos de inicialización, si no están inhibidos con ''-n
''). Salga con un estado distinto de cero si se produce un error al ejecutar los comandosGDB
en los archivos de comando. [...]