【问题标题】:How can i receive dump heap? [duplicate]我怎样才能收到转储堆? [复制]
【发布时间】:2014-05-13 15:14:37
【问题描述】:

请提示我如何创建转储堆? 我尝试了,但文件中没有写入任何内容

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

【问题讨论】:

  • @sashoalm:不,那不一样。这个问题没有崩溃。
  • @BenVoigt Fix-my-code 问题无论如何都无效。但是,是的,也许我应该投票“不清楚你在问什么”。

标签: c++ winapi


【解决方案1】:
  1. 如果您没有提供任何 SEH 指针,那么您应该为第 5 个参数传递 NULL。
  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);

【讨论】:

    【解决方案2】:

    如果遇到异常,您可以使用以下代码编写小型转储。如果你想有“堆”信息,你需要使用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");
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 2019-04-28
      • 2016-11-03
      • 2019-06-21
      • 2018-07-09
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      相关资源
      最近更新 更多