一、背景
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行出现了访问空指针的操作。