我如何接收转储堆
How can i receive dump heap?
提示我如何创建转储堆?我尝试了,但是没有向文件
写入任何内容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 ); }
- 如果你没有提供任何SEH指针,那么你应该为第五个参数传递NULL。
- 你应该检查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");
}
相关文章:
- 分段故障(堆芯转储)矢量
- Cppcheck生成xml转储文件
- 如何找出GDB的SIGTRAP核心转储的根本原因
- C++映射分割错误(核心转储)
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 浮点异常(核心转储)#694457
- 分段错误(核心转储)但无法弄清楚
- 链接到libkcapi时没有核心转储
- 检测到堆栈粉碎:已终止 中止(核心已转储)
- 正在处理故障(堆芯转储)
- 分段错误(核心转储) - 使用 SavedModel 的 Tensorflow C++ API 进行推断
- 我不知道为什么这段代码会让核心被转储?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 在基数排序中,我得到 munmap_chunk():无效指针和中止(核心转储).为什么?
- C++指针无法在函数外部传递值和分段错误(核心转储)错误
- cygwin_exception::open_stackdumpfile:将堆栈跟踪转储到 class4.exe.sta
- C++快速将 int 数组内容转储到文本文件中
- 接收信号时如何自动化GDB核心转储
- 我如何接收转储堆