Qt 生成dump文件在vs调试

目录

1.pro中添加以下代码用于生成pdb文件

2.main.cpp中添加 

3.测试

4.打开vs,设置一下pdb文件的路径

5.设置完后点击仅本机调试,就可以定位到崩溃的地方了

6.源代码被修改

7.不是本机生成的dump文件


 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文件放在一个文件夹里面,并设置路径后可以打开。如果源文件修改过,定位的位置可能不对,但是可以参考一下是具体哪个函数崩溃的

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值