我如何接收转储堆

How can i receive dump heap?

本文关键字:转储 何接收      更新时间:2023-10-16

提示我如何创建转储堆?我尝试了,但是没有向文件

写入任何内容
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 ); }
  1. 如果你没有提供任何SEH指针,那么你应该为第五个参数传递NULL。
  2. 你应该检查MiniDumpWriteDump的错误HRESULT,这可能表明错误是什么。

这是一个工作示例代码从我的msdn博客

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);

如果遇到异常,可以用下面的代码编写一个迷你转储。如果您想拥有"堆"信息,您需要使用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.8Xn", 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");
}