使用的接口
生成dump文件,主要使用了win32的两个接口CreateFile() 和 MiniDumpWriteDump(),链接了MSDN的具体介绍
一个是创建dmp文件,一个是崩溃的时候,向dmp文件中写入相关信息
注意事项
1.头文件包含顺序
头文件包含,一定要把Windows.h放在DbgHelp.h的前面,如果该顺序反了会报各种错误,原因不清楚。
#include <Windows.h>
#include <DbgHelp.h>
2.IDE版本
因为我的开发工具是
QT: qt-opensource-windows-x86-5.9.9.exe;
VS: Microsoft Visual Studio Professional 2013 版本12.0.406290.00 Update 5;
插件: qt-vsaddin-msvc2013-2.3.2 .vsix;
相同的代码在vs中选择msvc2013编译运行崩溃后,未生成dump文件;
在Qt中编译运行崩溃后,则生成了dump文件。 原因不清楚。
源码
Qt使用的控制台的方案编译运行代码,会在编译生成的文件夹下生成dmp文件
#include <QCoreApplication>
#include <Windows.h>
#include <DbgHelp.h>
//链接静态库Dbghelp.lib
#pragma comment(lib,"Dbghelp.lib")
long __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
//创建 Dump 文件
HANDLE hDumpFile = ::CreateFile(
L"dumpFile.DMP",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hDumpFile != INVALID_HANDLE_VALUE)
{
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pexcp;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//写入Dump文件内容
::MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hDumpFile,
MiniDumpNormal,
&dumpInfo,
NULL,
NULL
);
}
return 0;
}
void Test01()
{
char *p = NULL;
printf("%c\n",*p);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//注册异常回调函数
::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);
Test01();
return a.exec();
}