当前位置: 首页 > Linux

在Linux程序中集成breakpad

时间:2023-04-07 01:35:12 Linux

项目介绍Breakpad是Google开发的一个跨平台的C/C++dumpcapture开源库。crash文件以微软的minidump格式存储,也支持将dump文件发送到服务器。当程序崩溃时可以使用Breakpad。触发转储写入操作,或者在转储未触发时主动写入转储文件。breakpad支持windows、linux、macos、android、ios等,目前被GoogleChrome、Firefox、GooglePicasa、Camino、GoogleEarth等项目使用。首页:https://chromium.googlesource...文档:https://chromium.googlesource...GitHub地址:https://github.com/google/bre...主要组件breakpad主要有三个组件:breakpadclient:breakpad客户端静态库(即:libbreakpad_client.a)。它的主要作用是在程序崩溃后接管程序的异常处理。具体来说,它主要做了两件事。响应程序崩溃时收到的信号,包括:SIGSEGV、SIGABRT、SIGFPE、SIGILL、SIGBUS。(另外两个SIGSTOP和SIGKILL无法处理)获取程序崩溃时刻的运行时信息,并保存为minidump格式的文件。symboldumper:调试信息文件生成程序(即:dump_syms)。主要用于从可执行程序中提取与符号相关的信息,并将其保存为特定格式的文件。processor模块:minidumphandler(即:minidump_stackwalk),其作用是基于coredump和symbol文件构建一个可读的调用栈。下载编译下载Breakpad源码:gitclonehttps://github.com/google/bre...。下载Breakpad依赖的第三方库LSS:gitclonehttps://github.com/adelshokhy...,将LSS中的linux_syscall_support.h文件放到breakpad/src/third_party/lss/目录下。编译Breakpad:在源码目录下执行./configure&&make。libbreakpad_client.a位于src/client/linux/目录中。dump_syms在src/tools/linux/dump_syms/目录中。minidump_stackwalk在src/processor/目录中。在src/tools/linux/md2core/目录下还有一个程序minidump-2-core将minidump转换为core文件。集成breakpad首先,参考程序中异常处理器的头文件。#include"client/linux/handler/exception_handler.h"为了生成一个minidump文件,我们需要实例化一个ExceptionHandler对象,提供一个存储minidump的路径,以及一个回调函数来接收关于写入的minidump的信息。staticbooldumpCallback(constgoogle_breakpad::MinidumpDescriptor&descriptor,void*context,boolsucceeded){printf("转储路径:%s\n",descriptor.path());返回成功;}voidcrash(){volatileint*a=(int*)(NULL);*一个=1;}intmain(intargc,char*argv[]){google_breakpad::MinidumpDescriptordescriptor("/tmp");google_breakpad::ExceptionHandlereh(descriptor,NULL,dumpCallback,NULL,true,-1);碰撞();return0;}编译时需要链接breakpad提供的静态库libbreakpad_client.a,头文件搜索路径需要包含breakpad的src目录。编译运行这个程序,会在/tmp/目录下生成一个minidump文件,并在退出前打印该文件的路径。编译命令如下:$g++-g-I./-obreakpad_testtest.cpp./client/linux/libbreakpad_client.a-lpthread-std=c++11可能的。因为当函数被回调时,程序处于不安全状态。从其他库分配内存或调用函数可能不安全。如果您必须在回调函数中实现某些功能,最安全的做法是分叉并执行一个新进程来执行您需要执行的任何功能。Breakpad源代码包含一些简单的libc函数的重新实现。同样,src/third_party/lss包含一些用于进行Linux系统调用的函数。应避免直接调用libc和其他一些动态库。发送minidump文件在实际应用中,可以将minidump文件发送给服务器,以供后续的分析和统计工作。Breakpad源码中的相关文件在src/common/linux/http_upload.h(HTTP上传)和src/tools/linux/symupload/minidump_upload.cc(minidump上传)。  生成符号文件为了生成有用的堆栈信息,Breakpad要求将二进制文件中的调试符号转换为文本格式的符号文件。首先,您需要确保您的程序已使用-g编译以包含调试符号。然后使用dump_syms工具生成文本格式的符号文件。例如,如果程序名为test,则命令如下:$./dump_syms./test>test.sym为了使用minidump_stackwalk工具使用这些符号,还需要将它们放在特定的目录结构中。符号文件的第一行包含生成此目录结构所需的信息。例如上面的test.sym可以使用如下命令:$head-n1test.symMODULELinuxx86_646EDC6ACDB282125843FD59DA9C81BD830test$mkdir-p./symbols/test/6EDC6ACDB282125843FD59DA30C81$mvtest.sym./symbols/test/6EDC6ACDB848215根据minnidump和symbol生成stacktraceminidump_stackwalk工具可以提取一个minidump文件及其对应的text格式的symbol,生成可读的堆栈信息。在上面的示例中,可以使用以下命令生成最终可读堆栈信息文件:$./minidump_stackwalkxxxx.dmp./symbols>dmp_info.txt  usesummary使用-g选项编译程序。使用dump_syms工具将上一步生成的可执行文件中的符号提取出来,然后将符号文件放到指定目录下。不使用-g选项重新编译程序。程序崩溃时生成一个dmp文件。使用minidump_stackwalk工具将dmp文件转换为可读的堆栈信息文件。以上,使用自动化脚本更简单。