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();
}
};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
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.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.
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.