一、背景
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 fileHANDLE hDumpFile = ::CreateFile((LPCWSTR)appName.utf16(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if (hDumpFile != INVALID_HANDLE_VALUE){//Dump infoMINIDUMP_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行出现了访问空指针的操作。