Post Mortem Debugging



  • Gibts eigentlich eine Möglichkeit Programmen die mit VS 2005 kompiliert wurden, im Absturzfall so etwas wie einen core dump erzeugen zu lassen? Das was XP immer an MS senden will muß ja eigentlich so was ähnliches sein. Wie kann ich das für mich nutzen. (Ich will nicht MS bezahlen um mir den dump zurückschicken zu lassen)



  • Das einfachste ist, dass Du den Dump selber erzeugst.
    Siehe dazu: SetUnhandledExceptionFilter und MiniDumpWriteDump.
    Dann wird ein MiniDump erzeugt, welcher Du mit VS2005 oder WinDbg debuggen kannst (Callstack, Sourcezeilen, usw.).
    Wichtig ist, dass Du die *passende* PDB und EXE zu dem MiniDump hast! (du brauchst die pdb *nicht* auszuliefern, solltest sie aber bei Dir lokal haben!)

    Z.B.

    #include <windows.h>
    #include <tchar.h>
    #include <dbghelp.h>
    #pragma comment(lib, "Dbghelp.lib")
    LONG WINAPI MyUnhandledExceptionFilter(EXCEPTION_POINTERS* ExceptionInfo)
    {
    TCHAR szDumpFile[1024];
    GetModuleFileName(NULL, szDumpFile, sizeof(szDumpFile) / sizeof(TCHAR));
    _tcscat(szDumpFile, _T(".exp.dmp"));
    HANDLE hDumpFile = CreateFile(szDumpFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
    MINIDUMP_EXCEPTION_INFORMATION expi;
    expi.ThreadId = GetCurrentThreadId();
    expi.ClientPointers = NULL;
    expi.ExceptionPointers = ExceptionInfo;
    
        MiniDumpWriteDump(
          GetCurrentProcess(), GetCurrentProcessId(),
          hDumpFile,
          MiniDumpNormal,
          &expi,
          NULL,
          NULL);
        CloseHandle(hDumpFile);
      }
      return EXCEPTION_CONTINUE_SEARCH;
    }
    
    int _tmain()
    {
      SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
    
      char *szTest = NULL;
      strcpy(szTest, "Hallo Welt");  // BANG...
    }
    

    Siehe aber auch:
    http://blog.kalmbachnet.de/?postid=75



  • Siehe auch:
    http://www.tech-archive.net/Archive/German/microsoft.public.de.vc/2004-03/0196.html

    PS: Dir muss abert bewusst sein, dass ein 100&ig sicheres auffangen der Exception inProcess nicht möglich ist. Dies geht nur ab Vista mit dem WER bzw. wenn Du das Programm unter einem debugger laufen lässt.
    Aber zu 98% bekommst Du alles mit...



  • Danke, das hilft schon mal weiter.



  • hallo...

    gibt es auch eine möglichkeit das unter windows 2000 zu verwenden?

    Windows meckert dass er den zugehörigen Einstiegspunkt nicht finden kann.

    Stefan



  • Du solltest die dbghelp.dll Deiner Applikation beilegen.


Anmelden zum Antworten