Googlepad是一款用于程序崩溃时自动生成转储文件(.dmp)的可跨平台开源库。
1.Googlepad代码下载地址:
git clone https://chromium.googlesource.com/breakpad/breakpad
如果翻不了墙可以在gitee上下载breakpad模块。
2.Googlepad采用gyp来实现构建管理(语法与CMAKE差不多)
gyp工具下载地址:
git clone https://chromium.googlesource.com/external/gyp
如果翻不了墙可以在gitee上下载gyp模块。
gyp是Python代码,提供了gyp.bat供Windows下使用;gyp脚本供Linux下使用。
gyp不需要编译只需要配置环境变量。下图为Windows下配置gyp的PATH环境变量。
3.gyp打包需要Python2.X的支持。推荐Python2.7(python-2.7.18.amd64.msi)。
Python环境下载地址:Download Python | Python.org
Python安装可参照网上教程,或者直接下一步。安装完成或配置环境变量。
4.Googlepad依赖于GoogleTest,需将GoogleTest源码下的googlemock和googletest两个子文件夹拷贝到googlepad/src/testing目录下。
5.准备工作就绪后(Python2.7已安装,环境变量配置好,源码下载移植完毕)就可以使用gyp来实现构建代码生成工程文件。
Windows操作系统下:
预先安装了Virtual Studio2019。
打开cmd窗口,cd进入breakpad\src目录,然后执行以下命令:
gyp.bat --no-circular-check client\windows\breakpad_client.gyp
用VS2019打开解决方案
修改client_tests工程的属性 c++--》常规--》将警告视为错误改成“否”。
凡是编译过程遇到错误可都修改工程的属性。
也可根据自己需要选择MD MT MDD MTD。
最终可执行文件和生成的二进制如下所示:
下画红线的是需要在使用工程依赖的库文件。
此时可以进行测试。运行crash_generation_app.exe触发点击Client下的任一崩溃。
从源代码可知会在c:\dumps下生成崩溃转储文件.dmp。
6.dmp文件进行跟踪定位,可以用VS工具(需要预先装,所占空间比较大),也可以用Windbg来调试。正在上传…重新上传取消
Windbg使用步骤:
- 加载pdb描述符标识文件;File--》symbol file path --》Browser选择崩溃程序的pdb调试文件。
- 加载源代码文件;File--》Source file path --》Browser选择崩溃程序的源代码文件夹(工程的顶层文件)。
- 打开crash产生的.dmp文件。File--》Open crash dump --》选择生成的dmp文件。
- 输入!analyze -v查看语法分析详情。
可以知道出错的文件和方法名,及大概的错误方向。
输入kv可以看出当前堆栈情况。
摘抄一段:crash_generation_app!google_breakpad::DerefZeroCrash+0x2 (Inline Function @ 00007ff6`31ed1ea2) [D:\git\breakpad_build\src\client\windows\tests\crash_generation_app\crash_generation_app.cc @ 318]
可知崩溃时运行文件路径、文件名、方法名、行数318。
看一下代码:
VS调试dump文件网上也有很多讲解。
1.File-->打开-->文件打开崩溃转储文件。
2.设置符号路径
解决方案资源管理器配置源代码。如果没有出现解决方案资源管理器可以在视图里找
3.点击解决方案--》属性--》调试源文件,新增工程源码文件夹。
点击“使用 仅供本机 进行调试”。耐心等待加载完毕(此过程非常慢,建议windbg)。
//实践//
QT中使用案例:Windows下基于MSVC
因为编译的Google BreakPad是采用MT方式的,所以.pro文件需对构建方式进行指定。
新建了头文件include文件夹,依赖库lib文件夹。
CONFIG(debug, debug|release) {
QMAKE_CXXFLAGS_DEBUG += /MTd
}
CONFIG(release, debug|release) {
QMAKE_CXXFLAGS_RELEASE += /MT
}
INCLUDEPATH += $$PWD/include/breakpad
win32:CONFIG(release, debug|release): {
LIBS += -L$$PWD/lib/x64/release/ -lcommon
LIBS += -L$$PWD/lib/x64/release/ -lcrash_generation_client
LIBS += -L$$PWD/lib/x64/release/ -lexception_handler
}
else:win32:CONFIG(debug, debug|release): {
LIBS += -L$$PWD/lib/x64/debug/ -lcommon
LIBS += -L$$PWD/lib/x64/debug/ -lcrash_generation_client
LIBS += -L$$PWD/lib/x64/debug/ -lexception_handler
}
else:unix: LIBS += -L$$PWD/lib/x64/ -lcommon
INCLUDEPATH += $$PWD/lib/x64/release
DEPENDPATH += $$PWD/lib/x64/release
//需要引入头文件
#include "client/windows/handler/exception_handler.h"
代码集成//
//测试 Google breakpad 终端
google_breakpad::ExceptionHandler *processDump =
new google_breakpad::ExceptionHandler(
std::wstring(L"c:/Dumps"), nullptr,
nullptr,nullptr,
google_breakpad::ExceptionHandler::HANDLER_ALL,
nullptr);