windows下Qt软件调试-cmake | qmake配置 qBreakpad定位崩溃位置

1、环境

Windows10/11
Qt版本:Qt5.12.5
编译器版本:msvc2019_64

2、源码

下载qBreakpad:

git clone https://gitcode.com/buzzySmile/qBreakpad.git

下载breakpad:

git clone https://gitcode.com/google/breakpad.git

下载linux-syscall-support:

git clone https://gitcode.com/ithaibo/linux-syscall-support.git

3、qmake测试以及使用qBreakpad

参考链接:https://blog.youkuaiyun.com/qq_43627907/article/details/126603907

注意:在release模式下,若没生成dmp文件,可能是因为安装了搜狗输入法!!!

通过打印信息,打开文件夹“E:\搜狗浏览器\SogouInput\Components\crash”,
在这里插入图片描述
发现qBreakPad生成的dmp文件记录到文件夹“E:\搜狗浏览器\SogouInput\Components\crash”下的crash.dmp里。

4、cmake配置qBreakpad

我们可以通过qmake获取qBreakpad.lib,所以在这里用静态库的方式使用qBreakpad。

步骤一、文件整理

将生成的lib文件以及使用到的头文件整理如下:
在这里插入图片描述
将qBreakpad\handler下的singletone、QBreakpadHandler.h和QBreakpadHttpUploader.h复制到include。

qmake在debug和release下生成的lib放到对应的lib\debug和lib\release。

将整理好的qBreakpad复制到你的项目里。

步骤二、cmake配置

#只在构建时 引入的头文件,为不对外开放的三方库
target_include_directories(${PROJECT_NAME} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/qBreakpad/include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/qBreakpad/include/singletone>
)
if(WIN32)
    # 首先,确保设置了 CMAKE_BUILD_TYPE
    if(NOT DEFINED CMAKE_BUILD_TYPE)
        set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
    endif()

    if(CMAKE_BUILD_TYPE MATCHES Debug)
        message(STATUS "Debug build configuration")
        target_link_libraries(${PROJECT_NAME} PUBLIC
            ${CMAKE_CURRENT_SOURCE_DIR}/qBreakpad/lib/debug/qBreakpad.lib
        )
elseif(CMAKE_BUILD_TYPE MATCHES Release)
    message(STATUS "Release build configuration")
    # 设置编译选项,以在Release模式下也生成PDB文件
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
    set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
    target_link_libraries(${PROJECT_NAME} PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/qBreakpad/lib/release/qBreakpad.lib
    )
else()
    message(STATUS "Unknown build type: ${CMAKE_BUILD_TYPE}")
endif()	

参考链接
https://blog.youkuaiyun.com/kangkanglhb88008/article/details/133864909

<think>嗯,用户想在Qt项目中集成QBreakpad,我需要详细说明步骤。首先,我应该回忆QBreakpad的相关知识。记得QBreakpadQt的一个崩溃捕获库,基于Google Breakpad。那用户需要完整的流程,包括下载、配置、编译、集成到项目、测试和调试。 首先,下载和准备库。用户需要从GitHub克隆仓库,比如提到的buzzySmile/qBreakpad。然后整理目录结构,可能需要将头文件和库文件放到合适的位置。这一步要注意不同平台的处理方式,比如Windows用lib,Linux用.a,macOS用framework。 接下来是编译QBreakpad。可能需要用CMakeqmake来构建。用户可能对编译步骤不熟悉,需要详细说明如何生成静态库。例如,在Windows下用CMake生成VS工程,然后编译得到qBreakpad.lib。同时,注意依赖项,比如异常处理库是否要启用。 然后是集成到Qt项目。用户需要修改.pro文件,添加包含路径和链接库。这里要分平台处理,比如win32、macx、linux的不同配置。还要记得复制崩溃处理工具到输出目录,比如minidump_stackwalker,这样生成的dump文件可以后续分析。 代码集成部分,需要在main函数中初始化QBreakpad,设置dump存储路径。这部分代码示例很重要,用户可以直接复制粘贴。同时,提醒用户根据平台调整路径,特别是macOS需要.app bundle的结构。 测试和调试阶段,用户可能需要手动触发崩溃,比如调用abort(),然后检查是否生成dump文件。还要说明如何用工具分析dump文件,比如使用breakpad的symbol工具生成符号,再用minidump_stackwalker解析。 可能遇到的问题包括路径错误、库未正确链接、平台差异等。需要提醒用户注意这些点,并参考提供的引用资料,比如引用[1]和[2]提到的静态库使用和跨平台封装。引用[3]中的资料链接也可能对用户有帮助。 最后,生成相关问题,帮助用户深入理解,比如跨平台差异、dump文件分析、与其他崩溃捕获库的对比等。确保回答结构清晰,步骤详细,用户能一步步操作。</think>### 在Qt项目中集成QBreakpad的完整流程 #### 一、准备工作 1. **下载QBreakpad源码** 从GitHub克隆仓库: ```bash git clone https://github.com/buzzySmile/qBreakpad.git ``` 建议将`qBreakpad`目录放在Qt项目同级或子模块中[^3]。 2. **文件整理** - 将`src/breakpad`目录下的`client`、`common`、`handler`等核心代码保留 - 删除平台无关的测试文件(如`test`目录)[^1] #### 二、编译QBreakpad库 1. **Windows平台** - 使用CMake生成VS工程,编译生成`qBreakpad.lib` ```cmake cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Release .. ``` - 启用`ENABLE_EXCEPTIONS`选项以支持异常捕获[^1] 2. **Linux/macOS** - 使用qmake编译: ```bash qmake CONFIG+=release make ``` - 生成静态库`libqBreakpad.a`(Linux)或`qBreakpad.framework`(macOS)[^2] #### 三、Qt项目集成 1. **修改.pro文件** ```qmake # 添加包含路径 INCLUDEPATH += $$PWD/qBreakpad/src # 平台相关配置 win32 { LIBS += -L$$PWD/qBreakpad/lib -lqBreakpad DEPENDPATH += $$PWD/qBreakpad/lib } macx { LIBS += -F$$PWD/qBreakpad/bin -framework qBreakpad } linux { LIBS += -L$$PWD/qBreakpad/lib -lqBreakpad } ``` 2. **复制依赖文件** - 将编译生成的`minidump_stackwalker`工具复制到输出目录 - 部署`crashreporter`可执行文件(用于崩溃报告上传) #### 四、代码集成 ```cpp #include <QBreakpadHandler.h> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 初始化崩溃捕获 QBreakpadInstance.setDumpPath("crashes"); // 设置dump文件存储目录 QBreakpadInstance.setReporterPath("crashreporter"); // 设置报告工具路径 // 你的业务代码... return app.exec(); } ``` #### 五、测试验证 1. **触发测试崩溃** 添加测试按钮触发崩溃: ```cpp connect(ui->crashButton, &QPushButton::clicked, []{ int* ptr = nullptr; *ptr = 1; // 触发空指针崩溃 }); ``` 2. **分析dump文件** - 在设置的`crashes`目录中查找`.dmp`文件 - 使用命令解析: ```bash minidump_stackwalker crash.dmp > crash.log ``` #### 六、跨平台注意事项 | 平台 | 关键差异 | |---------|---------------------------------| | Windows | 需要`dbghelp.lib`和`WinHttp.lib`依赖 | | macOS | 必须打包为`.app` bundle格式 | | Linux |配置`sys/signal.h`信号处理 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值