使用WinDbg查看Qt的错误信息

使用WinDbg查看Qt中引起程序崩溃的原因

Qt中程序崩溃往往没有任何错误提示,只提示程序异常结束。如果在项目复杂的时候往往很难找出错误原因,使用WinDbg生成的日志中能更加直观地看到错误的信息,以便程序员更改。
在这里插入图片描述

Qt中项目中pro文件加入以下代码

HEADERS += windbg.h

QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO

QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO

LIBS += -lDbgHelp

在Qt项目中新建一个h文件

在这里插入图片描述

命名为WinDbg,并加入以下代码

#ifndef WINDBG_H
#define WINDBG_H

#include <QApplication>
#include <QDir>
#include <QDateTime>
#include <windows.h>
#include <dbghelp.h>
long  __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp)
{
    QString appName = QCoreApplication::applicationDirPath();
    appName.append("/dmpDir");
    QDir dir(appName);
    if(!dir.exists()){
        dir.mkpath(appName);
    }
    appName.append("/")
            .append(QCoreApplication::applicationName())
            .append(".")
            .append(QString::number(QDateTime::currentMSecsSinceEpoch()))
            .append("_CRASH_DUMP.DMP");

    //create Dump file
    HANDLE hDumpFile = ::CreateFile(
                (LPCWSTR)appName.utf16(),
                GENERIC_WRITE,
                0,
                NULL,
                CREATE_ALWAYS,
                FILE_ATTRIBUTE_NORMAL,
                NULL
                );
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump info
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pexcp;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;
        //write Dump
        ::MiniDumpWriteDump(
                    GetCurrentProcess(),
                    GetCurrentProcessId(),
                    hDumpFile,
                    MiniDumpNormal,
                    &dumpInfo,
                    NULL,
                    NULL
                    );
    }
    return 0;
}
#endif // WINDBG_H

main函数调用以下函数

::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);
  • 以下代码为例
int main(int argc, char *argv[])
{
    ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);
    QApplication a(argc, argv);
    MainWidget w;
    w.show();

    return a.exec();
}

下载WinDbg

进入此网页进行下载

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/

在这里插入图片描述

WinDbg的设置

  • 点击文件

  • 点击Settings

  • Debugging settings

  • 添加项目路径,我的项目是在debug模式下生成的,则在项目路径的debug文件夹下,dempDir是我们生成dump文件的地方,完成后点击ok

在这里插入图片描述

  • 打开程序运行崩溃后生成dump文件

在这里插入图片描述

  • 滑倒最底下点击*!analyze -v*

在这里插入图片描述

  • 等待加载完成会生成一段错误信息的分析

在这里插入图片描述

  • 我这里是setGeometry函数出错,我需要回去检查这个函数中是否有传入空指针或者野指针
  • 检查后发现,我这边指针为初始化就进行使用了

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Windbg是一款强大的调试工具,可以用于查看和分析调试信息。在Windbg中,可以使用调试器命令窗口来输入调试程序命令并查看命令输出。这是我们进行调试时主要打交道的窗口。\[2\]此外,如果需要深入研究问题,还可以使用IDA反汇编工具来查看二进制文件中的汇编代码的上下文,以最直观地了解软件崩溃的原因。\[1\]对于静态分析dump文件,可以按照一般的步骤进行分析,具体的步骤可以参考一篇详细的文章,如《使用Windbg静态分析dump文件的一般步骤详解》。\[3\]总之,Windbg是一个功能强大的调试工具,可以帮助我们查看和分析调试信息。 #### 引用[.reference_title] - *1* *3* [Windbg使用详解](https://blog.csdn.net/chenlycly/article/details/120631007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Windbg调试(使用方法)](https://blog.csdn.net/qq_34754747/article/details/105230294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值