2013-07-29 13 views
7

Ich mein echtes GDB-Skript beim Analysieren einer Kerndatei Ich versuche, einen Zeiger zu dereferenzieren und bekomme "Fehler in der Quellbefehlsdatei: Speicher kann nicht auf Adresse zugreifen" und dann stoppt mein GDB-Skript. Was ich will ist, einfach mein gdb-Skript auszuführen, ohne anzuhalten. Ist es möglich?gdb stoppt in einer Befehlsdatei, wenn ein Fehler auftritt. Wie geht es trotz des Fehlers weiter?

Dies ist ein Testprogramm und ein Test-GDB-Skript, das mein Problem zeigt. In dieser Situation hat der Zeiger einen NULL-Wert, aber in einer realen Situation wird der Zeiger keinen ungültigen ungültigen Wert haben.

Dies ist Test C-Programm:

#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; 
} 

Dies ist ein Test gdb Skript:

>cat analyze.gdb 
p p->v1 
q 

Und dies ist Demonstration des Problems (was ich von GDB will hier ist, diesen Fehler zu bekommen Nachricht und dann gehen Prozess quit Befehl):

>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 


Aktualisieren
Danke an Tom. Dies ist ein gdb-Skript, das dieses Problem behandelt:

Dies ist, wie es funktioniert:

>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" 

Antwort

4

Die Befehlssprache von gdb hat keine Möglichkeit, einen Fehler bei der Verarbeitung eines Befehls zu ignorieren.

Dies ist jedoch problemlos möglich, wenn Ihr gdb mit der Python-Erweiterung erstellt wurde. Suchen Sie nach dem Skript "ignore-errors". Damit können Sie:

(GDB) ignorieren-Fehler drucken * foo

... und Fehler von Druck werden gezeigt, aber nicht den Rest des Skripts abbrechen.

+0

Vielen Dank für Ihren Rat.Ich habe es nicht geschafft, 'ignore-errors' zu verwenden, da ich' Undefined command: 'ignore-errors' 'bekomme, aber ich habe einen ähnlichen Befehl erstellt und ich habe gearbeitet. –

+0

Ja, du musstest danach suchen. http://sourceware.org/ml/gdb/2010-06/msg00100.html –

+0

Lassen Sie mich erklären. In gdb auf meinem Server gibt es ignore-errors.py, aber ich weiß noch nicht, wie man es benutzt. Die Eingabe von 'ignore-errors print p' funktioniert nicht. Trotzdem habe ich die Idee in der ignore-errors.py benutzt und meine eigenen 'my_ignore_errors' erstellt. Sie können es in meiner aktualisierten Frage sehen. –

0

Ich glaube nicht, das ist möglich, da die Ausführung auf dem Zeiger beruht. Was Sie jedoch tun könnten, ist, dem Zeiger einen neuen Wert zuzuweisen, wenn Sie diesen Fehler z. set yourPointer = <another object of the same type>. Ihr Programm kann dann den dereferenzierten Wert verwenden, um fortzufahren.

1

Sie können dies auch tun:

gdb a.out < analyze.v2.gdb 

Dadurch werden die Befehle in analyze.v2.gdb Zeile für Zeile durchführen, selbst wenn ein Fehler auftritt.

1

Wenn Sie gerade verlassen wollen, wenn ein Fehler auftritt, können Sie die -batch gdb option verwenden:

Run im Batch-Modus. Beenden Sie mit dem Status 0 nach der Verarbeitung aller Befehle Dateien mit '-x' angegeben (und alle Befehle aus Initialisierungsdateien, , wenn nicht mit '-n' gesperrt). Beenden Sie mit einem Nicht-Null-Status, wenn bei der Ausführung der GDB-Befehle in den Befehlsdateien ein Fehler auftritt. [...]