写这篇文章之前,看了一些其他人的博客,但不是很详细,缺这少那的,好多都是复制粘贴别人的东西。自己动手弄了弄,可以使用,就记下来备忘与分享。
前言、开发环境说明
编程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、代码部分添加:
添加头文件,
#include <Windows.h>
#include <Dbghelp.h>
#include <tchar.h>
引入一个必要的库,
#pragma comment(lib,"Dbghelp.lib ")
在main.cpp中定义并实现几个函数:
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException);
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
CreateDumpFile(_T("Test.dmp"), pException);
FatalAppExit(-1, _T("*** Unhandled Exception ***"));
return EXCEPTION_EXECUTE_HANDLER;
}
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
在主函数int main(int argc, char *argv[])中添加:
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次,不知道为啥。
操作完成后,在VS2017界面内,效果为:
这一眼就看出问题所在了,问题定位OK.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)