windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)

我们在刚开始项目开发时,经常会因为各种粗心造成各种各样的容易使项目运行时崩溃的代码,比如,给空指针的指向赋值。然而,当项目的文件数非常多时,想找到出错的代码的位置是费事而让人心烦的。crashpad就可以在项目运行崩溃的瞬间生成dump文件,Crashpad会将收集的崩溃信息和相关数据组织成一个崩溃报告,并将报告保存在本地dump文件中。使用vs打开dump文件,就可以看到造成崩溃的代码行和代码所在文件。

接下来详细介绍怎么使用crashpad来在项目运行崩溃时生成dmp文件。

1、首先,找到我们下载好的crashpad复制到项目的根目录下面,在vs2019中新建项目控制台应用程序CrashpadTest。如下:

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第1张图片
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第2张图片
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第3张图片

2、右击项目名,在弹出的窗口中选择最下面的属性,点击属性,会弹出属性页对话框。在属性页中,点击c/c++ -> 点击常规 -> 点击附加包含目录中点击右侧的下拉箭头 -> 点击编辑,会弹出附加包含目录对话框。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第4张图片

3、在弹出的附加包含目录进行如下操作。

在弹出的选择目录选项中找到项目的根目录,然后点击进入crashpad目录,选择include文件夹。点击确定,点击确定。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第5张图片
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第6张图片

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第7张图片

4、继续点击属性页的链接器 -> 输入 -> 附加依赖项右侧下拉按钮 -> 编辑,弹出附加依赖项对话框。输入:

crashpad/lib/debug/base.lib
crashpad/lib/debug/client.lib
crashpad/lib/debug/common.lib
crashpad/lib/debug/util.lib
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第8张图片

注意:

1、要将下载好的crashpad放入项目的根目录下,然后才可以在附加依赖项输入上面的内容。对应的目录和lib文件如下。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第9张图片

2、因为创建的项目的目标平台是x64,所以下载的crashpad也应该是64位的。

在这里插入图片描述

因为创建的项目是debug模式,所以选择的是crashpad下的debug目录下的依赖库,如果创建的是release模式下项目,附加依赖项中应该写入以下内容:

crashpad/lib/base.lib
crashpad/lib/client.lib
crashpad/lib/common.lib
crashpad/lib/util.lib

对应的目录和lib文件如下:

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第10张图片

5、点击应用。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第11张图片

6、在CrashpadTest.cpp中添加头文件,编写代码。

CrashpadTest.cpp 


#include 
#include "client/crash_report_database.h"
#include "client/crashpad_client.h"
#include "client/settings.h"

using namespace std;
using namespace crashpad;

std::wstring getExecutableDir()
{
    HMODULE hModule = GetModuleHandleW(NULL);
    WCHAR path[MAX_PATH];
    DWORD retVal = GetModuleFileNameW(hModule, path, MAX_PATH);
    if (retVal == 0)
    {
        return NULL;
    }
    else
    {
        wchar_t* lastBackslash = wcsrchr(path, '\\');
        if (lastBackslash == NULL)
        {
            return NULL;
        }
        else
        {
            *lastBackslash = 0;
        }
    }
    return std::wstring(path);
}

bool initializeCrashpad()
{
    using namespace crashpad;
    std::map<std::string, std::string> annotations;
    std::vector<std::string> arguments;

    //改为自己的crashpad_handler.exe 路径
    std::wstring appPath = getExecutableDir();
    std::wstring exePath = appPath + L"/crashpad_handler.exe";

    std::wstring crashDirPath = appPath + L"/log";
    std::string url("http://127.0.0.1:8000");
    arguments.push_back("--no-rate-limit");

    //放dump的文件夹 按需改
    base::FilePath db(crashDirPath);
    //crashpad_handler.exe 按需改
    base::FilePath handler(exePath);

    std::unique_ptr<CrashReportDatabase> database =
        crashpad::CrashReportDatabase::Initialize(db);

    if (database == nullptr || database->GetSettings() == NULL)
    {
        return false;
    }

    database->GetSettings()->SetUploadsEnabled(true);

    CrashpadClient client;
    bool ret = client.StartHandler(handler,
        db,
        db,
        url,
        annotations,
        arguments,
        true,
        true);
    if (ret == false)
    {
        return false;
    }

    ret = client.WaitForHandlerStart(INFINITE);
}


int main()
{
	initializeCrashpad();//程序运行前初始化崩溃时生成dmp文件
    int* a = nullptr;
    *a = 9;
    cout << "值为:" << "*a" << endl;
    return 0;
}

7、右键项目名称,点击生成。此时会出现以下错误。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第12张图片

解决方法:右击项目点击属性进入项目属性页 -> c/c++ -> 预处理器 ->预处理器定义,加入NOMINMAX,然后点击确定,点击应用。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第13张图片

8、右击项目,点击重新生成。生成成功。

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第14张图片

9、此时会生成解决方案的目录(是项目根目录下的x64文件夹)。在解决方案文件夹找到项目的可执行文件CrashpadTest.exe所在文件夹。在文件夹中加入crashpad如下目录下的两个文件,crashpad_handler.exe和zlib1.dll

项目可执行文件所在目录:
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第15张图片
crashpad_handler.exe和zlib1.dll所在目录
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第16张图片
加入后的项目可执行文件目录:
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第17张图片

10、点击可执行文件CrashpadTest.exe。此时在可执行文件目录下就生成了一个log文件夹。点击进入log\reports\,就可以看到生成了一个dump类型的文件。然后双击文件夹在vs2019中打开,就可以看到崩溃所在的文件和代码行。windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第18张图片

windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第19张图片
windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件(步骤超详细)_第20张图片

至此,windows系统下使用crashpad为vs2019项目在崩溃时生成dump文件完成。

你可能感兴趣的:(C++,QT,windows,c++)