2013-07-29 24 views
7

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" 

Odpowiedz

4

Język poleceń gdb nie pozwala zignorować błędu podczas przetwarzania polecenia.

Można to łatwo zrobić, jeśli twój gdb został zbudowany z rozszerzeniem Python. Wyszukaj skrypt "ignore-errors". Z tym, można:

(gdb) ignorowanych błędy druku * foo

... i wszelkie błędy z nadrukiem zostaną pokazane ale nie przerwać resztę swojego skryptu.

+0

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. –

+0

Tak, musiałeś to poszukać. http://sourceware.org/ml/gdb/2010-06/msg00100.html –

+0

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. –

0

Nie sądzę, że to możliwe, ponieważ wykonanie opiera się na wskaźniku. Możesz jednak przypisać do wskaźnika nową wartość, gdy trafisz ten błąd, np. set yourPointer = <another object of the same type>. Twój program może następnie użyć wartości z dereferencji, aby kontynuować.

1

Można też to zrobić:

gdb a.out < analyze.v2.gdb 

ten będzie wykonywał polecenia w analyze.v2.gdb linia po linii, nawet jeśli wystąpi błąd.

1

Jeśli chcesz po prostu wyjść, jeśli wystąpi jakiś błąd, można użyć -batch gdb option:

Uruchom w trybie wsadowym. Wyjdź ze statusem 0 po przetworzeniu wszystkich plików określonych za pomocą "-x" (oraz wszystkich poleceń z plików inicjujących, , jeśli nie są zablokowane przez '-n'). Wyjdź z niezerowym stanem, jeśli wystąpi błąd podczas wykonywania poleceń w plikach poleceń w komendach GDB. [...]