Seite 1 von 1

Segmentation Faults: Das Leiden hat ein Ende

Verfasst: 1. April 2011 12:59
von franzf
Ein großes Problem, mit dem nicht nur C++-Anfänger zu kämpfen haben, sind Segmentation Faults, kurz SegFaults, zu Deutsch Speicherzugriffsfehler. Sie führen zum sofortigen Abbruch des Programms und sind damit für den Nutzer ärgerlich, noch mehr aber für den Programmierer, da er die Ursache für den SegFault finden muss.
Diesem Problem hat sich nun eine Eintwicklergruppe um den angesehenen freien Qt-Supporter Ogies Noraa angenommen, das Ergebnis ist erstaunlich!
Es wird ein neues Event eingeführt - QSegFaultEvent - welches man in einer von QObject abgeleiteten Klasse über die Implementierung der protected-Methode "segFaultEvent(QSegFaultEvent*)" abfangen kann. Weiterhin gibt es für die Diagnose die Klasse "QSegFaultBacktrace". Funktionieren tut dies natürlich auf allen von Qt unterstützten Plattformen.
Eine einfache Implementierung könnte dann so aussehen:

Code: Alles auswählen

class MyObject : public QObject {
protected:
    virtual void segFaultEvent( QSegFaultEvent* e ) {
        logger() << e->backtrace();
    }
};
Bei einem SegFault muss der Programmierer also nur noch nach dem Logfile fragen, und nicht erst über scripte das Programm in einem Debugger ausführen lassen.

Eine Alternative besteht darin, das event über QApplication::event() abzufangen. So kann man global SegFaults - auch von nicht-QObject-Klassen! - abfangen.

Was aber absolut verblüffend ist: man kann mit QSegFaultEvent::ignore() und QSegFaultEvent::accept() selber entscheiden, wie das Programm nach dem Auftreten des SegFaults reagieren soll. Per accept() wird sich das Programm beenden, so wie man das bisher gewohnt ist.
Setzt man aber ignore(), so stellt Qt den letzten stabilen Programmzustand wieder her, das Programm läuft von diesem Punkt aus weiter.
Ogies Noraa schreibt selber
This is THE milestone in C++ Development. It was alot of work, but the result is magnificent! At this point, Developers should stop using their old Frameworks and start learning Qt.
Außerdem scheint mittlerweile sicher, dass Microsoft Windows Mobile auf Nokia-Hardware keine große Zukunft hat. Die Vorteile dieser neuen Errungenschaften hat Nokia dazu bewogen, die Arbeit an MeeGo mit doppelter Entwicklerzahl voran zu treiben.

Ab Qt-4.8 werden die entsprechenden Klassen verfügbar sein. Es wird ein ganzes Modul "Qt Debugger" zur Verfügung stehen, mit dem die Analyse für den Nutzer unbemerkt während der Laufzeit des Programms stattfinden kann.

Verfasst: 1. April 2011 13:06
von padreigh
Meine erste Reaktion: SUPPPER - jetzt können Progger die nicht Proggen können ihre Fehler Ignorieren ;)

Verfasst: 1. April 2011 14:33
von bronko
April, April :?:

Verfasst: 1. April 2011 16:48
von pfid
Naja, die OCI Library hat mit dem 11er Client auch per Default einen Handler für SIGSEGV angemeldet ( :evil: ) ... so weit hergeholt ist das gar nicht ;)

Nur der Rest wirkt etwas unglaubwürdig :D

Verfasst: 1. April 2011 19:43
von franzf
pfid hat geschrieben:Nur der Rest wirkt etwas unglaubwürdig :D
Aber man wird wohl noch träumen dürfen :P

Man merkt, man kann euch nix vormachen. :( Ich hab mir aber auch einen verflixt dummen Tag ausgesucht...