Programmabsturz nach dem Beenden



  • Hallo

    Bei meinem aktuellen "Projekt" ist ein Fehler aufgetreten dem ich offenbar nicht Herr werde. Nachdem ich das Programm beendet habe (das Fenster ist schon zerstört) kommt erst die Windows-Meldung "[...] hat ein Problem festgestellt und muss beendet werden [...]". Ich hab schon viel probiert, Programmteile wegzulassen usw.. Der Absturz findet scheinbar erst nach (oder während?) des letzten Returns statt. Interessieren würden mich jetzt eure Erfahrungen: Wo sollte man da hinschauen, was sind typische Ursachen für so einen Fehler und so.



  • mach' in den handler für 'WM_CLOSE' oder 'OnClose' einfach ein einzelnes:

    ExitProcess(0);
    

    danach wird mit hoher wahrscheinlcihkeit nix mehr in dem programm ausgeführt, was crashen könnte.

    btw: wenn du den wirklichen fehler finden willst, lass es im debugger laufen und mach' einen breakpoint bei 'WM_CLOSE'...



  • Also erstmal, bevor ich irgendwas anderes gucke, probier' ich es mit dem Debugger. In dem "hat ein Problem festgestellt ... blablubb" Dialog (oder dem Dialog der davor kommt?) sollte z.B. schonmal ein "Debug" Button sein.
    Ansonsten einfach im Debug compilieren, aus der IDE rausstarten, Fehler provozieren (in dem Fall eben das Programm beenden - aber halt normal, nicht mit dem "STOP" Button vom Debugger klarerweise), und dann gucken WO er genau steht. Die MFC/CRT ASSERTs sind meist recht brauchbar dokumentiert. Ansonsten hilft oft der Callstack weiter. So lassen sich nach meiner Erfahrung ein Grossteil aller Fehler recht leicht finden.

    Wenn das aus irgendeinem Grund nicht geht... halt überlegen was es sein könnte. Wenn das Fenster schon weg ist, und der Fehler eben beim Beenden des Programmes passiert, dann würde ich als erstes mal annehmen dass es irgendwo in der static deinitialization phase passiert, im Destruktor des Fensters, oder in OnExitInstance. Was die static deinitialization phase angeht: statisch instanzierte Klassen mit Dtor, z.B. das "theApp" Objekt (falls du MFC verwendest).

    Falls du nicht MFC verwendest, bzw. garkein Window-Framework, guck einfach mal in WinMain nach was nach dem Message-Loop so kommt. Static deinitialization phase ist hier natürlich genauso ein heisser Tip, mit statisch instanzierten Klassen kann man viel Blödsinn machen 😉



  • Danke für die Anregungen. Also ich hatte einen Befehl der mir was in eine Datei schreibt in der allerletzten Zeile der WinMain und das hat funktioniert. Naja wie so oft finde ich wieder kurz nach dem posten zufällig den Fehler. In meinem Fall lags an einer Unachtsamkeit, hab beim default constructor einer Klasse etwas vergessen das ich bei den anderen Konstuktoren dabei hatte und der destructor sollte das dann wieder löschen, was halt dann gar nicht da war, was er scheinbar nicht so gerne macht.


Log in to reply