SetUnhandledExceptionFilter und MiniDumpWriteDump



  • Schnik Schnak...



  • hihi 🙂



  • Vielen Dank für die Infos Jochen.

    Muss mein Programm die dbghelp.dll mus ausliefern oder ist die ab Windows XP dabei?

    Grüsse
    Jörg


  • Mod

    Dabei... Nur für Win2K musste man die mit ausliefern.



  • Habe noch ein Frage vergessen.

    1.) Welche Typ von Minidumps erzeugt das Auffangsieb von Windows Vista bzw. Windows 7?

    2.) Reicht der Typ MiniDumpNormal, um ggf. einen Fehler zu beheben?

    Grüsse
    Jörg


  • Mod

    zu 1: MiniDumpNormal
    zu 2: Das kommt darauf an. Viele Simple Bugs lassen sich so leicht identifizieren. Callstack hast Du und genau Crash Position.
    Aber Du hast keine Daten. Du kannst Objekte nicht auf Ihre Inhalte kontrollieren. etc.

    Ich habe eine Option für meine Programme die es mir erlauben bei Bedarf einen FullDump zu erzeugen... D.h. auf der Befehlszeile oder in der Registry wird abgelegt welche Art von Dump erzeugt werden soll.

    BTW: Um Vista/Windows 7 Compatible zu sein musst Du den Crash an den Default-Handler von Windows weitergeben.



  • Martin Richter schrieb:

    zu 2: Das kommt darauf an. Viele Simple Bugs lassen sich so leicht identifizieren. Callstack hast Du und genau Crash Position.
    Aber Du hast keine Daten. Du kannst Objekte nicht auf Ihre Inhalte kontrollieren. etc.

    Gibt es noch einen "Zwischendump-Typ" der Objektinhalte enthält, aber kein FullDump ist? Also nicht ganz so groß.

    Martin Richter schrieb:

    BTW: Um Vista/Windows 7 Compatible zu sein musst Du den Crash an den Default-Handler von Windows weitergeben.

    Das wird imho ja erreicht in dem ich "EXCEPTION_CONTINUE_SEARCH" zurückgebe, korrekt?

    Noch ein Frage:
    Ich verstehe Jochens Blog Beitrag nicht ganz. Ich verwende VS2008 später dann VS2010. Meine Anwendung liegt als x86 und x64 Anwendung vor. Muss ich jetzt etwas beachten?

    Grüsse
    Jörg


  • Mod

    Lies die Doku und experimentiere.
    MiniDumpWithDataSegs!

    Ich benutze nur entweder Normal oder WithFullMemory...



  • Meine Kommentare zu den letzten Einträgen:

    Ich enpfehle Dir die dbghelp.dll mit auszuliefern... die von XP mitgelieferte ist nicht auf dem aktuellen Stand... aber über dieses Thema kann man lange diskutieren... wenn es sich bei Deiner Anwendung um ein reines native-Programm handelt, dann brauchst Du sie nicht auszuliefern, da die von XP ausreichend ist... wenn es aber auch managed Code enthält, dann ist die OS DLL zu alt...

    Und ob Du ab VS2008 etwas beachten musst: Ja 😉 ruf einfach das "PreventSetUnhandledExceptionFilter" auf, dann hast Du alles beachtet 😉

    Und der Vista/Win7 TaskManager erstellt ein FullDump

    Und ein "Auffangsieb" von Vista/Win7 erzeugt AFAIK gar kein MiniDump; es sei denn, Du hast Dein Programm bei WinQual angemeldet...



  • Jochen Kalmbach schrieb:

    Und ob Du ab VS2008 etwas beachten musst: Ja 😉 ruf einfach das "PreventSetUnhandledExceptionFilter" auf, dann hast Du alles beachtet 😉

    Im Deinem Blog schreibst Du "You can achieve this for x86 with the following code" und prüfst das Ganze auch noch mit dem Präprozessor. Meine Anwendung existiert aber auch als native x64 Anwendung.

    Jochen Kalmbach schrieb:

    Und ein "Auffangsieb" von Vista/Win7 erzeugt AFAIK gar kein MiniDump; es sei denn, Du hast Dein Programm bei WinQual angemeldet...

    Der Dialog "Awendung ist abgeschmiert..." und Fehlerbericht senden kommt immer. Man hat nur keinen Zugriff auf die gesendeten, wenn man bei WinQual nicht angemeldet ist. 😉

    Grüsse
    Jörg



  • Jörg2010 schrieb:

    Im Deinem Blog schreibst Du "You can achieve this for x86 with the following code" und prüfst das Ganze auch noch mit dem Präprozessor. Meine Anwendung existiert aber auch als native x64 Anwendung.

    Ja, das ist noch ein TODO 😉



  • Hi Jochen,

    sag mal bei deinem Source mit dem Call

    RaiseException(EXCEPTION_STACK_OVERFLOW,0,0,0);
    

    Kommt am ende des exception handlers die meldung:

    MsgBox schrieb:

    Run-TimeCheck Failure#0 - The value of ESP was not properly saved across a
    function call.

    Sollte man da nicht noch ESP lokal sichern??

    greetz
    -----------------------------------------
    Edit: so funzt's

    //...
    static DWORD cEsp;
    
    #ifdef EXCEPTION_HANDLER_STACK_RESERVE
    #ifdef _M_IX86
    if(pEx->... == EXCEPTION_STACK_OVERFLOW)
    {
      EnterCriticalSection(csException)
      static char MyStack[1024*196];
      __asm mov eax, offset MyStack[1024*196];
      __asm mov cEsp,esp;
      __asm mov esp,eax;
    }
    #endif
    #endif
    //...
    
    //on conditional or default return
    #ifdef EXCEPTION_HANDLER_STACK_RESERVE
    #ifdef _M_IX86
    if(pEx->... == EXCEPTION_STACK_OVERFLOW)
    {
       __asm mov esp,cEsp;
       LeaveCriticalSection(csException);
    }
    #endif
    #endif
    
    return EXCEPTION_EXECUTE_HANDLER
    


  • WIE hast Du denn Dein Projekt kompiliert!? /EHsc !?

    Dan stell mal um nach /EHa



  • Jo,..
    ich hatte es auf /EHsc,..

    thx


Anmelden zum Antworten