Breakpad在Windows平台使用示例
1.基本介绍
原文链接:https://blog.csdn.net/u010365536/article/details/125336510
Breakpad 是一套用于抓取应用崩溃数据的工具。Breakpad 可以在移除编译器调试信息后,抓取、压缩minidump信息,将其发送回你的服务器,然后为 C/C++ 生成调用栈。尽管 Google Breakpad 将自己定位成一个崩溃报告工具, 但实际上它更像一个调试辅助工具。Breakpad 的特点主要在于崩溃报告部分支持无符号抓取。整套工具实现了在客户使用无符号的发布版应用前提下, 开发者也能以较低代价恢复应用崩溃现场的调用栈。
1.1 三大组件
Breakpad 包含三大组件:
1.client:读取当前线程的状态、加载的可执行文件、共享库等信息,写入到minidump中。可以放到应用中,当崩溃发生时自动使用,或者显式调用;
2. symbol dumper:读取编译器生成的调试信息,产生基于 Breakpad 格式 的 symbol file;
3. processor:读取minidump寻找适合的 symbol file,生成可读的 C/C++ 调用栈。
1.2 minidump的文件格式
minidump是微软开发的和核心文件类似的文件格式。它包含:
- 该进程已加载的可执行文件和共享库列表,包括名称和版本;
- 进程中所有现场的列表,包括每个线程的寄存器状态、栈内容(纯字节流);
- 其他的系统信息,包括处理器、操作系统、崩溃原因等等。
1.3 minidump概览
默认情况下,Breakpad初始化时注册一个异常或信号处理函数,该函数能在异常发生时生成 minidump。注册方法依赖于平台。
- Windows中使用SetUnhandledExceptionFilter();
- OS X 中创建一个线程来等待 Mach 例外端口;
- Linux 中安装一个能处理像 SIGSEGV、SIGKILL 之类例外的信号处理函数。
- 上传崩溃现场的方法也有所不同
- 在 Windows 和 Linux 中, 调用一个独立的函数库上次;
- 在 OS X 中, 会有一个进程来请求用户授权上传操作。
1.4 Breakpad组件
src目录下有三个目录
- client,包含所有平台的minidump生成器;
- processor,用于服务端处理minidump;
- tools,包含构建工具的源代码。
- c/tools/{platform}/dump_sys 用于在给库去符号之前生成 Breakpad 符号文件。
1.5 Breakpad Client库
Breakpad Client 库用于监视应用的崩溃,并收集、上传数据。这主要通过异常/信号处理函数实现。由于应用运行在的处理器和操作系统可能不同,Client 的设计变化较大。Client 库和用来发送快照的库会链接成应用的一部分。异常在不同平台有不同表现,Breakpad在ExceptionHandler对象中设置了处理函数。具体的内部实现依平台而异。
2.Windows平台使用方法
在Windows平台上使用Breakpad,需要进行以下步骤:
- 链接库:将Breakpad库链接到你的代码中。具体的库文件取决于你的平台和编译环境。
- 注册处理函数:在程序初始化时,注册一个异常处理对象google_breakpad::ExceptionHandler
- 引发异常:在代码中人为地创建一个异常,触发异常处理函数。
- 生成minidump文件:当异常发生时,Breakpad会自动生成一个minidump文件,其中包含了异常的堆栈信息和其他相关信息。minidump文件将被保存在程序所在的目录下。
- 调试minidump文件:可以使用Visual Studio IDE来调试minidump文件。只需将minidump文件拖放到Visual Studio中,即可查看异常时的堆栈调用。
请注意,为了能够成功调试minidump文件,确保使用相同版本的程序、模块和pdb文件。否则,可能无法正确调试异常。
以上是在Windows平台上使用Breakpad的大致步骤。具体实现方式可能因平台和编译环境而异
2.1.breakpad使用示例
需要链接下面几个库
commoc.lib.lib
crash_generation_client.lib
exception_handler.lib
Code1
#include "client/windows/handler/exception_handler.h"
void exception_test()
{
int* p = nullptr;
*p = 0;
}
int main()
{
google_breakpad::ExceptionHandler* pCrashHandel =
new google_breakpad::ExceptionHandler(
L".",
NULL,
NULL,
NULL,
google_breakpad::ExceptionHandler::HANDLER_ALL,
NULL);
exception_test();
return 0;
}
程序运行后,在代码的第15行会发生异常,在程序目录下会生成dmp文件。
2.2.VS IDE调试Dmp文件
Dmp文件调试条件:需要触发异常的pdb符号文件,debug默认生成pdb文件,release可以在vs中设置生成调试文件。
需要注意的是,为了能够成功调试,需要确保使用的可执行文件、符号文件以及相应的pdb文件版本一致,否则可能无法正确查看符号信息和堆栈调用。
-
使用vs打开dmp文件
-
设置符号路径
-
使用 仅限本机 进行调试
2.3.版本发布
版本发布是指将软件或应用程序的特定版本发布给最终用户或客户使用的过程。在版本发布过程中,通常会生成相应的可执行文件、共享库、配置文件等,并且可能还包含调试文件(如pdb文件)用于调试和分析异常情况。
在发布过程中,需要确保版本一致性,即包含的文件需要与客户机器上的应用程序和模块一致,以便在客户机器出现异常时进行调试和定位问题。为了实现这一点,通常会将客户使用的版本与相应的调试文件(如dmp文件和pdb文件)一起分发给客户。
一种常见的方法是使用Visual Studio(VS)进行版本发布。在VS中,可以通过设置来生成调试文件,并通过设置符号路径来指定异常应用程序或模块的pdb文件路径。当客户机器出现异常时,可以使用相应的dmp文件和客户的版本信息,利用VS查看异常时的堆栈调用。
此外,还有一些工具可以用于捕获应用程序崩溃数据,例如Google Breakpad。Breakpad可以在移除编译器调试信息后,抓取、压缩minidump信息,并将其发送回服务器,然后生成调用栈。这样开发者可以在客户使用无符号的发布版本应用的前提下,以较低的代价恢复应用崩溃现场的调用栈。
总结起来,版本发布是将特定版本的软件或应用程序发布给最终用户或客户的过程。在发布过程中,需要确保版本一致性,并提供相应的调试文件以便进行调试和定位问题。
2.3.1使用Breakpad发布版本
发布的release版本,生成时需要生成pdb文件。版本内要包含pdb文件,将版本分为两部分,pdb作为版本的一部分,另部分下发给客户。当客户机器出现异常时,根据版本信息查找客户使用的版本,获取客户产生的dmp文件,dmp文件结合客户相应的版本就可以使用vs查看异常时的堆栈调用了。
注意事项:dmp文件、异常应用程序及模块、以及相应的pdb文件需要版本一致,否者无法调试。