一、捕捉异常生成Dump文件
#include <QtGui/QApplication>
#include <QString>
#include <QTime>
#include <QDir>
#include <Windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")
LONG WINAPI SystemExceptionCall(_EXCEPTION_POINTERS* ExceptionInfo)
{
// 获取生成路径
QString logFile = "./";
// 判断路径是否存在
if (!QDir(logFile).exists())
{
// 路径不存在则创建
QDir().mkpath(logFile);
}
// 生成dump文件路径及名称
QString dumpName = QString("%1/%2.dmp").arg(logFile).arg(QDateTime::currentDateTime().toString("yyyyMMdd-hh_mm_ss"));
// 创建dump文件
#if 1
// 使用CreateFile创建Dump文件,适用于包含详细参数的文件创建
HANDLE hDumpFile = CreateFile(dumpName.toStdWString().c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#else
// Pdb文件的配置参数(如文件显隐,编辑状态等)
LPCREATEFILE2_EXTENDED_PARAMETERS fileParam = NULL;
// 使用CreateFile2创建Dump文件,适用于普通文件创建,通常不需要其他配置参数使用该函数更为快捷
HANDLE hDumpFile = CreateFile2(dumpName.toStdWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, fileParam);
#endif
if (hDumpFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ThreadId = GetCurrentThreadId(); // 当前线程Id
dumpInfo.ExceptionPointers = ExceptionInfo; // 当前异常指针
dumpInfo.ClientPointers = TRUE; // 写入Dump文件时,可以直接引用相关内存地址
// 创建Dump文件
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, &dumpInfo, NULL, NULL);
// 关闭文件句柄
CloseHandle(hDumpFile);
}
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[])
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)SystemExceptionCall);
QApplication a(argc, argv);
vs2008Dmp w;
w.show();
return a.exec();
}
二、调试Dump文件
1、将生成的dump文件和pdb文件放在同一目录下
2、用vs打开dump文件
点击启动调试即可
三、 一些疑问
在测试时,写了除零和数组越界,除零是可以生成dump文件,但是数组越界导致的程序崩溃没有生成dump文件是怎么回事???有人可以解答一下吗
另外windows本身会生成dump文件,上述的两种异常都可以生成,路径如下: