#if defined (_WIN32) || defined (WIN32)
#include <Windows.h>
#include <dbghelp.h>
#pragma comment(lib, "dbghelp.lib")
long __stdcall exceptionHander(_EXCEPTION_POINTERS* excp); //全局异常处理捕获
#endif
int main(int argc, char *argv[])
{
#if defined (_WIN32) || defined (WIN32)
SetUnhandledExceptionFilter(exceptionHander);
#endif
QApplication a(argc, argv);
MainWindow w;
w.show();
QTextCodec::setCodecForLocale(QTextCodec::codecForName("utf8"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8"));
return a.exec();
}
/*
*ExceptionCode 最可能遇到的几种类型
*C0000005h读写内存冲突
*C0000094h非法除0
*C00000FDh堆栈溢出或者说越界
*80000001h由Virtual Alloc建立起来的属性页冲突
*C0000025h不可持续异常,程序无法恢复执行,异常处理例程不应处理这个异常
*C0000026h在异常处理过程中系统使用的代码,如果系统从某个例程莫名奇妙的返回,则出现此代码,例如调用RtlUnwind时没有ExceptionRecord参数时产生的异常填入的就是这个代码
*80000003h调试时因代码中int3中断
*80000004h处于被单步调试状态
*
*返回值:
*
*EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以结束了
*EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
*EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行
*/
long __stdcall exceptionHander(_EXCEPTION_POINTERS* excp)
{
QDir dumpDir(QApplication::applicationDirPath() + "/dump/");
if(!dumpDir.exists())
{
dumpDir.mkdir(QApplication::applicationDirPath() + "/dump/");
}
QString strPath = QApplication::applicationDirPath() + "/dump/"
+ QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss")
+ ".dmp";
qDebug()<<strPath;
//创建转储文件
HANDLE hFile = CreateFile(strPath.toStdWString().c_str(), GENERIC_WRITE,
FILE_SHARE_WRITE, NULL, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, NULL );
if(hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION exptInfo;
exptInfo.ThreadId = ::GetCurrentThreadId();
exptInfo.ExceptionPointers = excp;
//将dump信息写入到文件中
MiniDumpWriteDump(GetCurrentProcess(),
GetCurrentProcessId(),
hFile, MiniDumpNormal,
&exptInfo, NULL, NULL);
}
QMessageBox::critical(NULL,TR("程序异常"),TR("程序产生异常,已生成dump转储文件"));
return EXCEPTION_EXECUTE_HANDLER;
}
程序是采用Qt写的,当程序运行过程中出现了crash,就会自动生成dump文件到和exe同级的dump文件夹下dump文件可以直接拖到VS里面进行分析