写这篇文章之前,看了一些其他人的博客,但不是很详细,缺这少那的,好多都是复制粘贴别人的东西。自己动手弄了弄,可以使用,就记下来备忘与分享。
前言、开发环境说明
编程IDE为:QTCreator。 Qt版本为5.12.2,编译器为安装VS2017社区版时自带的MSVC2017,32bit。
是在Windows10环境下开发的!!!本文也只局限于Windows环境 + QTCreator + MSVC编译器。
若是Linux环境,生成coredump并调试就不用如此复杂了。
一、 使得dmp文件能产生
1、在pro文件里添加:
#设置编译选项生成dmp文件
QMAKE_CFLAGS_RELEASE = -O2 -MD -Zi
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
2、代码部分添加:
添加头文件,
//Windows系统头文件
#include
#include
#include
引入一个必要的库,
#pragma comment(lib,"Dbghelp.lib ")
在main.cpp中定义并实现几个函数:
// 创建Dump文件,前置申明,当然实现也可以放在这里
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException);
// 处理Unhandled Exception的回调函数
//
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
//"Test.dmp"的路径与名称可以自己更改
CreateDumpFile(_T("Test.dmp"), pException);
// 这里弹出一个错误对话框并退出程序
//
FatalAppExit(-1, _T("*** Unhandled Exception ***"));
return EXCEPTION_EXECUTE_HANDLER;
}
// 创建Dump文件
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
//
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
//
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
//
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
在主函数int main(int argc, char *argv[])中添加:
// 设置处理Unhandled Exception的回调函数
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
人为点击按钮,制造一个奔溃:
void mainWindow::on_test_btn_clicked()
{
int * p = 0;
*p=900;
}
运行exe,点击按钮,程序提示:
此时,在exe同级目录下得到了Test.dmp文件。
二、 利用dmp文件定位错误
首先打开VS2017,将Test.dmp文件拖到VS2017(VS的版本要对应,不然MSVC版本对不上)界面即可(或者其他打开方式也行),按照下图的 1、2、3、4步骤操作,记得先不要勾选Microsoft符号服务器,不然要加载很久。
3这里的路径其实就是.pdb文件所在路径。
没有.pdb文件就无法定位错误。
几个需要注意的事项:
one: 是系统的pdb文件。如果第一次使用,勾选Microsoft符号服务器,然后设定在此目录下缓存符号。第一次下载比较漫长,要等待很久。第二次及以后使用的话,就取消勾选符号路径,把缓存符号的路径加上去就可以了。这样就不用下载了。
two: 是qt工程生成的pdb文件。编译器会生成一个pdb文件,一般跟exe文件同目录下,如果你把这个exe发给别人,记得保存好这个pdb文件,不然没办法准确定位出代码。
three: 是qt源代码的pdb文件。这个需要去官网下载自己对应的qt版本的pdb文件。
four: 设置好pdb文件路径,点击使用仅限本机进行调试,我这里需要点击2次,不知道为啥。