使用QTCreator编程时,如何利用dmp文件定位程序奔溃

写这篇文章之前,看了一些其他人的博客,但不是很详细,缺这少那的,好多都是复制粘贴别人的东西。自己动手弄了弄,可以使用,就记下来备忘与分享。

前言、开发环境说明
使用QTCreator编程时,如何利用dmp文件定位程序奔溃_第1张图片
编程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,点击按钮,程序提示:
使用QTCreator编程时,如何利用dmp文件定位程序奔溃_第2张图片
此时,在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次,不知道为啥。

使用QTCreator编程时,如何利用dmp文件定位程序奔溃_第3张图片

操作完成后,在VS2017界面内,效果为:
使用QTCreator编程时,如何利用dmp文件定位程序奔溃_第4张图片
这一眼就看出问题所在了,问题定位OK.

你可能感兴趣的:(QT,Linux/C++)