windows下程序崩溃时,不容易复现,但是可以通过dump文件进行处理
dump 文件对于为查找非常有帮助。对于一些突发的崩溃问题,可以有效的保留现场数据,供开发分析。可以在程序中添加控制,当程序崩溃时自动生成dump文件
下面是生成dump文件的代码 MyDump.h
#ifndef UTIL_MYDUMP_H__
#define UTIL_MYDUMP_H__
#include <windows.h>
#include <QDateTime>
#include <Dbghelp.h>
#include <QDir>
#pragma comment(lib , "DbgHelp.lib")
LONG CreateCrashHandler(EXCEPTION_POINTERS* pException) {
//创建 Dump 文件
QDateTime CurDTime = QDateTime::currentDateTime();
QString current_date = CurDTime.toString("yyyy_MM_dd_hh_mm_ss");
//dmp文件的命名
QDir d;
if (!d.exists("dump"))
{
d.mkdir("dump");
}
QString dumpText = "dump/Dump_" + current_date + ".dmp";
//EXCEPTION_RECORD* record = pException->ExceptionRecord;
//QString errCode(QString::number(record->ExceptionCode, 16));
//QString errAddr(QString::number((uint)record->ExceptionAddress, 16));
//QString errFlag(QString::number(record->ExceptionFlags, 16));
//QString errPara(QString::number(record->NumberParameters, 16));
HANDLE DumpHandle = CreateFile(dumpText.toLocal8Bit().data(),
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (DumpHandle != INVALID_HANDLE_VALUE) {
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//将dump信息写入dmp文件
auto tmp = MiniDumpWithFullMemory | MiniDumpWithHandleData |
MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData |
MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo |
MiniDumpWithFullAuxiliaryState | MiniDumpIgnoreInaccessibleMemory |
MiniDumpWithTokenInformation;
//将dump信息写入dmp文件
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), DumpHandle, MINIDUMP_TYPE(tmp), &dumpInfo, NULL, NULL);
CloseHandle(DumpHandle);
}
return EXCEPTION_EXECUTE_HANDLER;
}
void registerDump()
{
#ifdef QT_NO_DEBUG
#ifdef _WIN64
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CreateCrashHandler);
#endif // WIN64
#endif // QT_NO_QDEBUG_MACRO
}
#endif // UTIL_MYDUMP_H__
使用这个也很简单,在main函数入口处
#include "MyDump.h"
int main()
{
registerDump();
return 0;
}
这样,软件运行后,如果遇到突发崩溃,就会生成对应的dump,这样就不会没有头绪了。将生成的文件直接用vs studio 打开,配合相应的pdb,即可看对应的堆栈信息。从而找出崩溃原因。