企业网站怎么做毕业设计,wordpress页面添加水印,建筑模板厂投资多少钱,湖南建设银行网站是多少钱文章目录 一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试 二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况 三、源码Pro文件mian.cppMainWindowUi文件 总结 一、Pdb生成及Dump文件使用示例图
1.Pdb文件生成
下图先通过… 文章目录 一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试 二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况 三、源码Pro文件mian.cppMainWindowUi文件 总结 一、Pdb生成及Dump文件使用示例图
1.Pdb文件生成
下图先通过构建生成Pdb文件然后运行程序通过提前准备的崩溃按钮使得程序崩溃生成“dump文件”的演示。
2.Dump文件调试
下图是先将之前生成的Pdb文件移动至dump文件同级目录然后使用Visual Studio打开dump文件在界面中点击使用’仅限本机’进行调试调试程序。
3.参数不全Pdb生成的Dump文件调试
下图使用的Pdb文件为是在缺少相关参数的状态下生成的只有生成Pdb文件的命令符可以看到打开后点击使用’仅限本机’进行调试调试程序显示的崩溃位置是异常的。
二、个人理解
1.生成Pdb文件的方式
我整合的的生成Pdb方式有多种如下
在Qt项目内容中配置添加CONFIG force_debug_info如下图参考Qt-生成dump文件该链接中还额外添加了CONFIGseparate_debug_info的内容但是我个人测试只添加CONFIG force_debug_info也可以调试测试测试范围不全面欢迎指正。注配置内容仅支持当前位置的项目更换项目或者更换位置都需要重新添加。 在pro文件添加CONFIG force_debug_info也可生成Pdb文件用于调试。注在Pro文件添加后该项目任意位置可生成Pdb文件。 在pro文件添加QMAKE_CXXFLAGS_RELEASE Q M A K E C F L A G S R E L E A S E W I T H D E B U G I N F O 和 Q M A K E L F L A G S R E L E A S E QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO和QMAKE_LFLAGS_RELEASE QMAKECFLAGSRELEASEWITHDEBUGINFO和QMAKELFLAGSRELEASEQMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO可生成Pdb文件用于调试。**注在Pro文件添加后该项目任意位置可生成Pdb文件在添加QMAKE_LFLAGS_RELEASE $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO后是可以生成Pdb文件但是生成的Pdb文件会有异常可参考“第一段 第三节 参数不全Pdb生成的Dump文件调试效果”。**参考链接QT如何在Release编译下生成pdb文件 可更新Qt安装目录下对应编译器的msvc-desktop.conf文件更新QMAKE_CFLAGS_RELEASE为QMAKE_CFLAGS_RELEASE $$QMAKE_CFLAGS_OPTIMIZE -MD -O2 -MD -Zi如下图一更新QMAKE_LFLAGS_RELEASE为QMAKE_LFLAGS_RELEASE /INCREMENTAL:NO /DEBUG如下图二。 ** 注更新msvc-desktop.conf文件后当前编译器所编译的所有项目都会生成Pdb文件仅更新QMAKE_LFLAGS_RELEASE /INCREMENTAL:NO /DEBUG也可生成Pdb文件同样生成的Pdb文件会有异常可参考“第一段 第三节 参数不全Pdb生成的Dump文件调试效果”。**参考链接QT如何在Release编译下生成pdb文件
2.Dump文件不生产的情况
有些电脑中同一种状态不会崩溃可能是被Qt事件循环接收处理了。 如本文中的情况我个人在公司的电脑和我家的电脑运行就是只有一个生成Dump文件。 我个人测试无法生成Dump文件的电脑使用纯C的代码可进入指定的Dump生成函数只要进入Qt事件循环后就无法进入Dump生成函数猜测是被Qt事件循环接收处理了
三、源码
Pro文件
QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11#################### 1 #########################
## 在“Pro”文件中添下方代码后可生成PDB文件影响当前项目
## 生成PDB PdbDumpTest.pdb PdbDumpTest.vc.pdb
CONFIG force_debug_info#################### 2 #########################
## 生成PDB PdbDumpTest.pdb
#QMAKE_CXXFLAGS_RELEASE $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
#QMAKE_LFLAGS_RELEASE $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO#################### 3 #########################
## 在“构建设置”中“Build的步骤”中的“Additional arguments”添下方代码后可生成PDB文件影响当前目录的当前项目
# CONFIG force_debug_info#################### 4 #########################
## 在下方对应目录文件中参考如下更新文件的QMAKE_LFLAGS_RELEASE的赋值数据即可影响所有项目
## C:\Qt\Qt5.xx.xx\5.xx.xx\msvc2017_64\mkspecs\common\msvc-desktop.conf
#QMAKE_CFLAGS_RELEASE $$QMAKE_CFLAGS_OPTIMIZE -MD -O2 -MD -Zi
#QMAKE_LFLAGS_RELEASE /INCREMENTAL:NO /DEBUG# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES \main.cpp \mainwindow.cppHEADERS \mainwindow.hFORMS \mainwindow.ui# Default rules for deployment.
qnx: target.path /tmp/$${TARGET}/bin
else: unix:!android: target.path /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS target
mian.cpp
#include mainwindow.h#include QApplication
#include QDebug
#include QDir
#include QDateTime
#include QSharedMemory
#include QProcess
#include QMessageBox#ifdef Q_OS_WIN
#include Windows.h
#include DbgHelp.h
#pragma comment(lib, dbghelp.lib)
#endifLONG WINAPI SystemExceptionCall(_EXCEPTION_POINTERS* ExceptionInfo)
{// 获取生成路径QString logFile QApplication::applicationDirPath() /dump;// 判断路径是否存在if (!QDir(logFile).exists()){// 路径不存在则创建QDir().mkpath(logFile);}// 生成dump文件路径及名称QString dumpName QString(%1/%2.dmp).arg(logFile).arg(QDateTime::currentDateTime().toString(yyyyMMdd-hh_mm_ss));// 创建dump文件
#if 0// 使用CreateFile创建Dump文件适用于包含详细参数的文件创建HANDLE hDumpFile CreateFile(dumpName.toStdWString().c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
#else// Pdb文件的配置参数如文件显隐编辑状态等LPCREATEFILE2_EXTENDED_PARAMETERS fileParam Q_NULLPTR;// 使用CreateFile2创建Dump文件适用于普通文件创建通常不需要其他配置参数使用该函数更为快捷HANDLE hDumpFile CreateFile2(dumpName.toStdWString().c_str(), GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, fileParam);
#endifif (hDumpFile ! INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ThreadId GetCurrentThreadId(); // 当前现场IddumpInfo.ExceptionPointers ExceptionInfo; // 当前异常指针dumpInfo.ClientPointers TRUE; // 写入Dump文件时可以直接引用相关内存地址// 创建Dump文件MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, dumpInfo, Q_NULLPTR, Q_NULLPTR);// 关闭文件句柄CloseHandle(hDumpFile);}return EXCEPTION_EXECUTE_HANDLER;
}int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN//! 注册异常奔溃回调SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)SystemExceptionCall);
#endifQApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
MainWindow
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include QMainWindowQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();private slots:void on_btnCrash_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include mainwindow.h
#include ui_mainwindow.h#include QDebug
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui-setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_btnCrash_clicked()
{
// qCritical(test);qDebug() 123456 __FUNCTION__;int b 10;int a 10/(b-10);qDebug() 123456 a;
}
Ui文件
?xml version1.0 encodingUTF-8?
ui version4.0classMainWindow/classwidget classQMainWindow nameMainWindowproperty namegeometryrectx0/xy0/ywidth330/widthheight207/height/rect/propertyproperty namewindowTitlestringMainWindow/string/propertywidget classQWidget namecentralwidgetlayout classQGridLayout namegridLayoutitem row0 column1spacer nameverticalSpacerproperty nameorientationenumQt::Vertical/enum/propertyproperty namesizeHint stdset0sizewidth20/widthheight52/height/size/property/spacer/itemitem row1 column0spacer namehorizontalSpacerproperty nameorientationenumQt::Horizontal/enum/propertyproperty namesizeHint stdset0sizewidth110/widthheight20/height/size/property/spacer/itemitem row1 column1widget classQPushButton namebtnCrashproperty nametextstring崩溃/string/property/widget/itemitem row1 column2spacer namehorizontalSpacer_2property nameorientationenumQt::Horizontal/enum/propertyproperty namesizeHint stdset0sizewidth109/widthheight20/height/size/property/spacer/itemitem row2 column1spacer nameverticalSpacer_2property nameorientationenumQt::Vertical/enum/propertyproperty namesizeHint stdset0sizewidth20/widthheight51/height/size/property/spacer/item/layout/widgetwidget classQMenuBar namemenubarproperty namegeometryrectx0/xy0/ywidth330/widthheight23/height/rect/property/widgetwidget classQStatusBar namestatusbar//widgetresources/connections/
/ui
总结
通过配置编辑项目并使用系统提供的接口设置Dump文件生成函数最后使用Vs调试代码即可。
友情提示——哪里看不懂可私哦让我们一起互相进步吧 创作不易请留下一个免费的赞叭 谢谢 ^o^/)
注文章为作者编程过程中所遇到的问题和总结内容仅供参考若有错误欢迎指出。 注如有侵权请联系作者删除