Frage

habe ich einen Prozess, dass Griffe Ausnahmen groß. Er ruft:

_set_se_translator(exception_trans_func); 
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler);
_set_purecall_handler(purecallHandler);
set_terminate(terminateHandler);
set_unexpected(unexpectedHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
atexit(exitHandler); //ignored during an expected exit
_onexit(onexitHandler); //ignored during an expected exit

Immer wenn eine Ausnahme geschieht, eine der Handler aufgerufen wird, die für mich eine Crash-Dump erzeugt. Das Leben ist gut.

an einem Kundenstandort Außer. Wenn sie Herunterfahren des Prozesses gibt es eine Ausnahme, die nicht durch diese Anrufe aus irgendeinem Grund geleitet wird und sie erhalten die Fehlermeldung:

Die Anweisung in „0x101ba9df“ verweist auf Speicher in „0x00000004“. Der Speicher konnte nicht gelesen werden". Klicken Sie auf OK zu beenden .... "

Die Speicherreferenz von x000000004 sieht aus wie es ist wahrscheinlich ein Null-Zeiger. Und an dieser Adresse suchen erscheint ein globales STL-Objekt destructor sein (wahrscheinlich in dem initterm Anruf des CRT wo Globals gereinigt werden nach oben).

Im Moment bin ich irgendwie stecken aber da ich keine Diagnose Dump und Call-Stack erhalten kann und genau sehen, was los ist. So ....

Warum ist nicht die Ausnahme durch den oben Handler geleitet wird, und statt den Benutzer angezeigt werden?

Gibt es eine Möglichkeit zu verbergen, dass Dialog (da keinen Schaden an diesem Punkt getan wird)?

Und gibt es eine Möglichkeit, die Wurzel Fehler auf der Spur?

Vielen Dank für alle Ideen.

War es hilfreich?

Lösung

Was Betriebssystem ausgeführt wird sie?

Ich nehme an, Sie Einstellung des Fehlermodus mit so etwas wie

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

, um sicherzustellen, dass die Fenster springen nicht in mit einer eigenen Fehlerbehandlung?

Andere Tipps

Das klingt wie die CRT hat einen SEH try / catch-Block setzen (es kann nicht richtig schreiben, Abschriften Tritte in) um einiges Stück Code, und holt die Ausnahme die Nachricht anzuzeigen, so dass Sie nie Aufruf am Ende der nicht behandelte Ausnahme Codepfad. Möglicherweise müssen Sie einige CRT tun Hacking, um herauszufinden, was los ist.

Es könnte sein, dass STL-Code wird während der Zerstörung der globalen Variablen beim Programm Abschaltzeit und vielleicht ausgeführt wird (je nach Version von STL, dass Sie verwenden) einige globale Variablen, die es haben, erfordert bereits zerstört worden ist.

Ich habe das STL mit VS2008 gesehen. Es gibt einige STL-Sperrobjekte, die über eine Dateiebene statisch erstellt werden während des Starts.

Sind Sie mit STL in Ihren Fehler-Handler-Funktionen? Es könnte sein, dass einer von ihnen ist spät in der Programmabschaltung abgehend und das Problem verursacht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top