I mój prawdziwy skrypt gdb podczas analizy pliku core Próbuję wyłuskać wskaźnik i uzyskać komunikat "Błąd w źródłowym pliku komend: Nie mogę uzyskać dostępu do pamięci pod adresem", a następnie mój skrypt gdb zatrzymuje się. To, czego chcę, to po prostu kontynuować wykonywanie mojego skryptu gdb bez zatrzymywania się. Czy to możliwe?gdb zatrzymuje się w pliku polecenia, jeśli wystąpił błąd. Jak kontynuować pomimo błędu?
To jest program testowy i testowy skrypt gdb, który demonstruje mój problem. W tej sytuacji wskaźnik ma wartość NULL, ale w rzeczywistej sytuacji wskaźnik nie będzie miał wartości pustej.
To jest test C Program:
#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;
}
Jest to skrypt testowy gdb:
>cat analyze.gdb
p p->v1
q
I to jest demonstracja problemu (co chcę z gdb tutaj jest, aby ten błąd proces wiadomość, a następnie przejść komenda quit
):
>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
Aktualizacja
Podziękowania dla Toma. Jest to skrypt gdb, który obsługuje ten problem:
Jak to działa:
>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"
Dziękuję za poradę.Nie udało mi się użyć 'ignore-errors', ponieważ otrzymałem polecenie' Undefined: "ignore-errors" ', ale utworzyłem podobne polecenie i pracowałem. –
Tak, musiałeś to poszukać. http://sourceware.org/ml/gdb/2010-06/msg00100.html –
Pozwól mi wyjaśnić. W gdb na moim serwerze istnieje ignore-errors.py, ale nie wiem jeszcze, jak z niego korzystać. Po prostu wprowadzenie 'ignore-errors print p' nie działa. Mimo to skorzystałem z tego pomysłu w ignore-errors.py i stworzyłem własne 'my_ignore_errors'. Możesz to zobaczyć w moim zaktualizowanym pytaniu. –