目录
1.pro中添加以下代码用于生成pdb文件
QMAKE_LFLAGS_RELEASE += /MAP
QMAKE_CFLAGS_RELEASE += /Zi
QMAKE_LFLAGS_RELEASE += /debug /opt:ref
QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
LIBS += -lDbgHelp
2.main.cpp中添加
#include "mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QStandardPaths>
#include <QDateTime>
#include <QDir>
#ifdef Q_OS_WIN
#include <windows.h>
#include <WinUser.h>
#include <wingdi.h>
#include <dbghelp.h>
#endif
static LONG WINAPI exceptionCallback(struct _EXCEPTION_POINTERS* exceptionInfo)
{
QCoreApplication *app = QApplication::instance();
QString savePath =QCoreApplication::applicationDirPath() + "/dump/";
QDir dir(savePath);
if (!dir.exists() && !dir.mkpath(savePath)) {
app->exit(E_UNEXPECTED);
return EXCEPTION_EXECUTE_HANDLER;
}
savePath.append(QDateTime::currentDateTime().toString("yyMMddhhmm"));
savePath.append(".dmp");
HANDLE dump = CreateFileW(savePath.toStdWString().c_str(), GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == dump) {
app->exit(E_UNEXPECTED);
return EXCEPTION_EXECUTE_HANDLER;
}
MINIDUMP_EXCEPTION_INFORMATION miniDumpExceptionInfo;
miniDumpExceptionInfo.ExceptionPointers = exceptionInfo;
miniDumpExceptionInfo.ThreadId = GetCurrentThreadId();
miniDumpExceptionInfo.ClientPointers = TRUE;
DWORD idProcess = GetCurrentProcessId();
MiniDumpWriteDump(GetCurrentProcess(), idProcess, dump,
MiniDumpNormal, &miniDumpExceptionInfo, NULL, NULL);
CloseHandle(dump);
app->exit(E_UNEXPECTED);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
SetUnhandledExceptionFilter(exceptionCallback);
#endif
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
3.测试
void MainWindow::on_pushButton_clicked()
{
int a=10;int b=0;
qDebug()<<a/b;
}
4.打开vs,设置一下pdb文件的路径
5.设置完后点击仅本机调试,就可以定位到崩溃的地方了
6.源代码被修改
点击工具-选项 把要求源文件完全匹配取消勾选
7.不是本机生成的dump文件
将生成的exe,pdb文件放在一个文件夹里面,并设置路径后可以打开。如果源文件修改过,定位的位置可能不对,但是可以参考一下是具体哪个函数崩溃的