一、环境配置
勾选红框中选项 重新编译工程 release版本即可产生pdb文件
二、dump文件生产代码
#ifndef QTDUMPGENERATE_H
#define QTDUMPGENERATE_H
#include <QObject>
#include <QDir>
#include <QDateTime>
#include <QDebug>
#include <QCoreApplication>
//注意下面2个头文件引入的顺序
#include <windows.h>
#include <dbghelp.h>
class QtDumpGenerate
{
public:
QtDumpGenerate();
void ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
};
#endif // QTDUMPGENERATE_H
#include "qtdumpgenerate.h"
QtDumpGenerate::QtDumpGenerate()
{
}
void QtDumpGenerate::ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy_MM_dd_hh_mm_ss");
QString dmpFileName = QCoreApplication::applicationDirPath() + "/" +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));
qDebug()<<"errCode: "<<errCode;
qDebug()<<"errAddr: "<<errAddr;
qDebug()<<"errFlag: "<<errFlag;
qDebug()<<"errPara: "<<errPara;
HANDLE hDumpFile = CreateFile((LPCWSTR)QString(dmpFileName).utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if(hDumpFile != INVALID_HANDLE_VALUE){
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
else{
qDebug()<<"hDumpFile == null";
}
}
long ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
QtDumpGenerate dmpGenerate;
dmpGenerate.ApplicationCrashHandler(pException);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
int *p = nullptr;//make crash point
*p = 1;
init();
return a.exec();
}
三、vs调试dump文件