2014-05-13 25 views
-2

提示請如何創建轉儲堆? 我嘗試,但沒有數據被寫入到文件我如何收到轉儲堆?

case IDC_BUTTON2: 
hFile = CreateFile(TEXT("minidump.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

    if(hFile!=NULL && hFile!=INVALID_HANDLE_VALUE) 
    { 

    MINIDUMP_EXCEPTION_INFORMATION eInfo; 
    eInfo.ThreadId = GetCurrentThreadId(); 
    eInfo.ExceptionPointers = NULL; 
    eInfo.ClientPointers = FALSE; 

    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, 
     MiniDumpNormal, &eInfo, NULL, NULL); 

MessageBox(hDlg,L"MiniDumpCreate",L"Minidump",MB_OK); 

CloseHandle(hFile); } 
+0

@sashoalm:不,那是不一樣的。這個問題沒有崩潰。 –

+0

@BenVoigt修復我的代碼問題無論如何都是無效的。但是,也許我應該投票「不清楚你問的是什麼」。 – sashoalm

回答

1
  1. 如果你不提供任何SEH指針,那麼你應該將NULL傳遞的第5個參數。
  2. 您應該檢查來自MiniDumpWriteDump的錯誤HRESULT,這可能表明錯誤是什麼。

這裏是我的msdn blog

HANDLE hFile = CreateFileA(path, 
    GENERIC_READ|GENERIC_WRITE, 
    FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, 
    NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

if(hFile == INVALID_HANDLE_VALUE) 
    { 
    error = GetLastError(); 
    error = HRESULT_FROM_WIN32(error); 
    return error; 
    } 

// get the process information 
HANDLE hProc = GetCurrentProcess(); 
DWORD procID = GetProcessId(hProc); 

// generate the crash dump 
BOOL result = MiniDumpWriteDump(hProc, procID, hFile, 
    flags, NULL, NULL, NULL); 

if(!result) 
    { 
    error = (HRESULT)GetLastError(); // already an HRESULT 
    } 

// close the file 
CloseHandle(hFile); 
1

工作示例代碼,你可以寫一個小型轉儲用下面的代碼,如果你有一個例外。如果你想擁有「堆」的信息,你需要使用MiniDumpWithFullMemory

typedef BOOL (__stdcall *tMDWD)(
     IN HANDLE hProcess, 
     IN DWORD ProcessId, 
     IN HANDLE hFile, 
     IN MINIDUMP_TYPE DumpType, 
     IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL 
     //IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam OPTIONAL 
     IN CONST PVOID UserStreamParam OPTIONAL, 
     //IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL 
     IN CONST PVOID CallbackParam OPTIONAL 
     ); 

    static int WriteMiniDump(LPCTSTR szFN, struct _EXCEPTION_POINTERS *ep, MINIDUMP_TYPE miniDumpType = MiniDumpWithFullMemory) 
    { 
     int ret = EXCEPTION_EXECUTE_HANDLER; 
     HANDLE hFile; 
     static tMDWD pMDWD = NULL; 

     if (pMDWD == NULL) 
     { 
     HMODULE hdbghelpmod = LoadLibrary(_T("dbghelp.dll")); 
     if (hdbghelpmod == NULL) 
      return ret; 
     pMDWD = (tMDWD) GetProcAddress(hdbghelpmod, "MiniDumpWriteDump"); 
     } 
     if (pMDWD == NULL) 
     return ret; 

     hFile = CreateFile(szFN, 
     GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

     if (hFile != INVALID_HANDLE_VALUE) 
     { 
     MINIDUMP_EXCEPTION_INFORMATION stMDEI; 
     stMDEI.ThreadId = GetCurrentThreadId(); 
     stMDEI.ExceptionPointers = ep; 
     stMDEI.ClientPointers = TRUE; 
     // try to create an miniDump: 
     if (pMDWD(
      GetCurrentProcess(), 
      GetCurrentProcessId(), 
      hFile, 
      miniDumpType, 
      &stMDEI, 
      NULL, 
      NULL 
     ) == FALSE) 
     { 
      printf("Minidump failed! 0x8.8X\n", GetLastError()); 
      OutputDebugString(_T("Minidump failed!")); 
     } 
     else 
     { //ret = 0; // suceeded } 
     CloseHandle(hFile); 
     } 
     return ret; 
    } 

然後你可以使用它像這樣:

__try 
{ 
    fread((char*)0x12, 0x10, 1, (FILE*)0x12); 
} 
__except (WriteMiniDump(_T("c:\\Temp\\MyDump.dmp"), GetExceptionInformation()) 
{ 
    printf("Handled"); 
}