2013-02-28 55 views
1

當我的程序崩潰時,它會從未處理的異常處理程序創建一個小型轉儲程序。我遇到的問題是人們向我發送崩潰轉儲,但是當我嘗試在Visual Studio 2010中打開它們時,它說它們已損壞(「轉儲文件的格式無效」)。我沒有在我的程序中分發dbghelp.dll,我需要嗎?我假設如果它是一個版本問題,Visual Studio會讓我知道並且不輸出上面的消息。Windows損壞的小型轉儲程序

我用它來生成日誌的代碼是

LONG WINAPI OnUnhandledException(PEXCEPTION_POINTERS pExceptionInfo) 
    { 
     MINIDUMP_EXCEPTION_INFORMATION ei; 
     ei.ExceptionPointers = pExceptionInfo; 
     ei.ThreadId = GetCurrentThreadId(); 
     ei.ClientPointers = FALSE; 

     DWORD dwProcessId = GetCurrentProcessId(); 
     SYSTEMTIME stLocalTime; 
     GetLocalTime(&stLocalTime); 
     wchar_t CrashDumpW[1024]; 
     swprintf_s(CrashDumpW, NELEMS(CrashDumpW), 
       L"%s\\%s-%s-%04X-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", 
       g_CrashDirectory.c_str(), L"Program", MAJOR_VERSION_STR, 
       INTERNAL_VERSION, stLocalTime.wYear, stLocalTime.wMonth, 
       stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, 
       stLocalTime.wSecond, dwProcessId, ei.ThreadId); 

     HANDLE hFile = CreateFileW(CrashDumpW, GENERIC_READ | GENERIC_WRITE, 
      NULL, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
     MiniDumpWriteDump(GetCurrentProcess(), dwProcessId, hFile, 
      MiniDumpScanMemory, &ei, NULL, NULL); 
     CloseHandle(hFile); 

     return EXCEPTION_EXECUTE_HANDLER; 
    } 
+0

這是一個非常不尋常的問題。但是,沒有部署自己的dbghelp.dll副本是非常罕見的,因爲XP沒有。 – 2013-02-28 03:01:08

+0

dmp文件是否用windbg打開? – selbie 2013-03-01 07:48:24

+0

@selbie不,它不會以「未指定的錯誤」失敗。這是漢斯的一個好點,我會看看分發dbghelp是否解決了這個問題。 – user1520427 2013-03-01 09:44:18

回答

0

這可以通過某人調試過程中造成的。我注意到如果一個進程有一個調試器,它產生的小型轉儲通常會以完全相同的方式損壞。它們的尺寸小於正常生產的尺寸。

由於您從您的處理程序中返回EXCEPTION_EXECUTE_HANDLER,默認的未處理的異常處理程序會在您的處理程序之後執行,這可能會導致DrWatson進入操作並作爲調試程序附加到您的進程。