qt “程序异常结束” dmp分析

一、背景

qt程序执行过程中出现异常退出,软件中唯一体现的内容如下,对问题定位来有些难度,为了尽快准确地定位到程序异常点,借助windbg工具进行排查。
如下是调试过程中实操,希望能对诸位道友有所帮助。

二、windbg 配置及dmp文件获取

windbg配置已亲测有效。使用过程中无需修改。按照步骤操作即可。后面有时间了备注代码含义。

1-主函数中配置如下,放置到主函数开始位置

::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);

在这里插入图片描述

2-建立Windbg.h文件如下,合入到工程中

#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

在这里插入图片描述

3-工程文件最后添加如下代码

QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE += $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
LIBS += -lDbgHelp

如下图:
在这里插入图片描述

4-.dmp文件获取

程序异常后将在debug目录或release目录中生成dmpDir文件夹,文件夹中即可看到生成的dmp文件。

三、dmp文件解析

1-dmp工具:windbg分析工具获取

windbg工具获取路径如下:
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/
直接点击windbg即可。
在这里插入图片描述

2-打开dmp文件

打开windbg工具后如下图所示,配置dump file文件,选择上文提到的dirdump,点击“open”。
在这里插入图片描述

此时能看到“Command”中的异常内容。如下图所示,可以看到出现了**“Access violation”**内存访问异常的错误警告。
在这里插入图片描述

可以点击下面的“!abalyzs -v”进行自动化分析。需要等待一段时间。执行完后如下图所示。

在这里插入图片描述
此处可以看到在程序中18行出现了访问空指针的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值