2014-05-13 38 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"); 
}