Catch Segfault oder andere Fehler / Ausnahmen / Signale in C ++ wie das Abfangen von Ausnahmen in Java

8

Ich habe ein Linux-Programm geschrieben, das auf einer fehlerhaften Open-Source-Bibliothek basiert. Diese Bibliothek löst manchmal Fehler aus, die ich nicht kontrollieren kann. Und natürlich, sobald die Bibliothek Segfaults hat, stirbt das gesamte Programm ab. Allerdings muss ich sicherstellen, dass mein Programm läuft, auch wenn die Bibliothek segfaults hat. Das liegt daran, dass mein Programm gewissermaßen als "Server" dient und es den Kunden zumindest sagen muss, dass etwas Schlimmes passiert ist, und sich von den Fehlern erholen, anstatt herauszuhauen ... Gibt es eine Möglichkeit, das zu tun?

Ich verstehe in Java, dass man nur eine Ausnahme abfangen muss. Aber wie geht C ++ damit um?

[UPDATE] Ich verstehe, dass es auch Ausnahmen in C ++ gibt, aber Segfault ist keine Ausnahme, oder? Ich denke nicht, dass etwas geworfen wird, wenn segfault passiert. Du musst explizit etwas "werfen", um es zu versuchen .... Fang .... soweit ich weiß.

Vielen Dank, ich bin ziemlich neu in C ++.

    
CodeNoob 15.05.2011, 12:52
quelle

4 Antworten

13

Sie können zuverlässig setzen die Ausführung nach einer Segmentierungsverletzung fort. Wenn Ihr Programm weiterhin ausgeführt werden muss, sperren Sie die betroffene Bibliothek in einem separaten Prozess und kommunizieren Sie über eine Pipe mit dieser. Wenn eine Segmentierungsverletzung auftritt, wird Ihr Programm die geschlossene Pipe bemerken.

    
Sam Miller 15.05.2011, 13:06
quelle
4

Leider können Sie das Programm nicht fortsetzen. Der fehlerhafte Code, der zu SIGSEGV führte, löst normalerweise ein undefiniertes Verhalten aus, z. B. den Dereferenzierung eines Nullzeigers oder das Lesen von Speichermüll. Sie können möglicherweise nicht fortfahren, wenn Ihr Code ungültige Daten verarbeitet.

Sie können mit dem Signal umgehen, aber das meiste, was Sie tun können, ist, den Stack-Trace auszugeben und zu sterben.

C und C ++ sind inhärent unsicher , Sie können nicht mit Fehlern umgehen, die durch undefiniertes Verhalten ausgelöst wurden, und das Programm weiterlaufen lassen.

    
Alex B 15.05.2011 13:06
quelle
3

Sie können Signalhandler verwenden. Es ist jedoch nicht wirklich empfehlenswert, da Sie nicht garantieren können, dass Sie die Ursache des Problems beseitigt haben. Am besten ist es, es in einem separaten Prozess zu isolieren - das ist der Ansatz von Google Chrome.

Wenn es FOSS ist, ist es am einfachsten, es nur zu debuggen.

    
Puppy 15.05.2011 13:22
quelle
2

Wenn Sie Zugriff auf die Quelle haben, kann es nützlich sein, den Programmierer in einem Debugger wie GDB auszuführen. GDB stoppt an der Zeile, die den segfault verursacht.

Wenn Sie das Signal wirklich abfangen wollen, müssen Sie einen Signalhandler anschließen, indem Sie der signal Systemaufruf . Ich würde wahrscheinlich nur am Debugger bleiben.

BEARBEITEN: Da Sie schreiben, dass die Bibliothek segfaults, möchte ich nur darauf hinweisen, die erste Regel der Programmierung: Es ist immer deine Schuld . Besonders wenn Sie ein Neuling in C ++ sind, passiert der segfault wahrscheinlich, weil Sie die Bibliothek in irgendeiner Weise falsch verwendet haben. C ++ ist eine sehr subtile Sprache und es ist leicht Dinge zu tun, die Sie nicht vorhaben.

    
Jørgen Fogh 15.05.2011 12:57
quelle