Lio*_*azi 12 c++ minidump std crash-dumps visual-studio-2008
我试图为我的应用程序创建一个转储文件崩溃.我目前正在使用带有-e标志的procdump.exe来执行此操作,因此如果我的应用程序中有未处理的异常,procdump会为我创建一个转储文件.
我以为我已经完成了,但后来我发现我的应用程序崩溃并且procdump没有创建转储文件.经过一些调查后,我发现无效使用vector :: front会导致运行时错误.我打开了_SECURE_SCL_THROWS标志,之后procdump.exe -e确实捕获了崩溃并创建了一个转储文件.
现在问我的问题:现在procdump.exe -e会在我的应用程序崩溃时始终创建转储文件吗?我如何保证我没有任何其他procdump -e对我不利的场景?
Mar*_*ndl 14
我假设你在Windows环境中(因为你使用procdump.exe).您还可以为程序设置一个异常过滤器,在应用程序崩溃时写入一个mindump:
使用SetUnhandledExceptionFilter注册一个回调函数,该函数将在崩溃时调用.可能的签名是:
LONG WINAPI HandleException(struct _EXCEPTION_POINTERS* apExceptionInfo)
Run Code Online (Sandbox Code Playgroud)
使用以下方式在某处注册:
SetUnhandledExceptionFilter(HandleException);
Run Code Online (Sandbox Code Playgroud)定义一个函数指针来调用Function MiniDumpWriteDump:
typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONSTPMINIDUMP_USER_STREAM_INFORMATIOUserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
Run Code Online (Sandbox Code Playgroud)使用MiniDumpWriteDump函数在先前注册的回调方法(HandleException)中编写转储(需要DbgHelp.dll 5.1或更高版本):
HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll"));
MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");
HANDLE hFile = ::CreateFile(_T("dump_name"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
_MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = apExceptionInfo;
ExInfo.ClientPointers = FALSE;
pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
::CloseHandle(hFile);
Run Code Online (Sandbox Code Playgroud)小智 7
/*WinDump.cpp*/
#ifdef WIN32
#include <windows.h>
#include <Dbghelp.h>
#include <tchar.h>
typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
void create_minidump(struct _EXCEPTION_POINTERS* apExceptionInfo)
{
HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll"));
MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");
HANDLE hFile = ::CreateFile(_T("core.dmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
_MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = apExceptionInfo;
ExInfo.ClientPointers = FALSE;
pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
::CloseHandle(hFile);
}
LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo)
{
create_minidump(apExceptionInfo);
return EXCEPTION_CONTINUE_SEARCH;
}
#endif // WIN32
Run Code Online (Sandbox Code Playgroud)
/*WinDump.h*/
#ifdef WIN32
LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo);
#endif // WIN32
Run Code Online (Sandbox Code Playgroud)
/*main.cpp*/
#include "WinDump.h"
int main(int argc, char **argv)
{
// Create a dump file whenever the gateway crashes only on windows
SetUnhandledExceptionFilter(unhandled_handler);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8455 次 |
| 最近记录: |