携手创造,一起生长!这是我参加「日新计划 8 月更文应战」的第16天,点击检查活动概况

布景

作为一名程序,最头疼的莫过于项目上线后收到程序溃散的通知,若能够在手头重现出该问题,那相对来说项目能够及时的修正并更新;假如无法重现外网溃散的问题,那就十分的”头疼”了。要是能够实时的搜集到项目的溃散信息,那该多好啊!这并不是一种什么奢求,现在就有现成的技能解决方案。这段时间,我一直在帮项目开发程序溃散的搜集功能,其顶用到的技能方案便是 Google 开发的 Breakpad。

Google Breakpad是什么?

Google Breakpad 是 Google 开发的一个跨平台的溃散搜集库。运用这个库能够在 Windows, Mac, Linux, iOS 和 Android 平台上对程序的溃散进行捕获,并生成 dump 文件供后期剖析。也是现在最成熟运用最广的开源库,并且这个库现在依然在更新和维护。

它首要包含三个部分:

  • dumpSyms 担任读取用户开发运用中的debug信息,并生成特定的符号文件。
  • client 在溃散体系中担任抓取当时线程和当时载入的库生成 minidump 文件。
  • processor 经过 minidump_stackwalk 读取 minidump 文件 找到合适的符号文件发生一个可读的 c/c++ 调用栈。

breakpad原理图

使用 Google Breakpad 来助力解决程序崩溃

在默许情况下,当程序溃散时 breakpad 会生成一个 minidump 文件,它在不同平台上的完成机制不一样,解说如下:

  • 在 Windows 平台上,运用微软供给的 SetUnhandledExceptionFilter() 办法来完成。
  • 在 OS X 平台上,经过创立一个线程来监听 Mach Exception port 来完成。
  • 在 Linux 平台上,经过设置一个信号处理器来监听 SIGILL SIGSEGV 等异常信号。

Breakpad 在所有的平台上都运用 minidump 文件格局,minidump 文件格局是由微软开发的用于溃散上传,它包含:

  • 当 dump 生成时进程中一系列 executable 和 shared libraries, 包含这些文件的文件名和版本号。
  • 进程中的线程列表,对于每个线程,minidump 包含它在寄存器中的状况,线程的 stack memory 内容。这些数据都是未解析的字节省,Breakpad client 一般没有调试信息能生成函数名,行号,乃至无法确定 stack frame 的边界。
  • 其他搜集关于体系的信息,如处理器,操作体系高版本,dump 的原因等等。

breakpad的运用

在 Github 大将 Breakpad 源码下载到本地:github.com/google/brea…

编译

翻开终端,cd 到源码途径,编译源码:

./configure && make

编译之前请先在电脑上经过homebrew安装cmake东西,不然会报错。

生成 dump_syms

找到途径 /breakpad-main/src/tools/mac/dump_syms/dump_syms.xcodeproj,然后经过 Xcode 编译生成 dump_syms。

生成 libBreakpad.a

本文经过在 iOS 平台上集成 Breakpad 来演示溃散搜集,所以这儿咱们只会去编译供 iOS 运用运用的 .a 库。

找到途径 /breakpad-main/src/client/ios/Breakpad.xcodeproj,然后经过 Xcode 翻开它,然后编译成 libBreakpad.a。

好了,到这儿咱们的准备工作就做好了,接下来就来看看如何去解析溃散吧!

项目集成

首先创立一个 iOS App 的测验工程,然后在工程中依靠咱们上面编译生成的 libBreakpad.a 库。

然后在 didFinishLaunchingWithOptions 办法里参加

[[BreakpadController sharedInstance] start: YES];

在 applicationWillTerminate 办法时参加

[[BreakpadController sharedInstance] stop];

代码如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [[BreakpadController sharedInstance] start:YES];
    return YES;
}
- (void)applicationWillTerminate:(UIApplication *)application{
    [[BreakpadController sharedInstance] stop];
}

除了依靠库之外,咱们还得在工程中参加一些装备,这也是 Breakpad 所要求的,不然 Breakpad 在初始化的时分就会初始化失利。

翻开咱们的测验工程的 plist,然后为其加上以下内容:

 <key>BreakpadProduct</key>
    <string>Google_Notifier_Mac</string>
    <key>BreakpadProductDisplay</key>
    <string>${PRODUCT_NAME}</string>
    <key>BreakpadURL</key>
    <string>这儿请填入您自己要上传的服务器地址</string>
    <key>BreakpadReportInterval</key>
    <string>30</string>

这些装备做完了今后,接下来咱们就要来模拟一次溃散啦!这还不容易吗?直接写一个数组越界的逻辑就能够模拟 Crash 啦!

代码如下:

- (IBAction)Triger:(id)sender {
    NSArray *array = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", nil];
    NSString *value = [array objectAtIndex:8];
}

当咱们点击这个按钮事情的时分,就会触发这次溃散。

Breakpad 在捕获到这次溃散时,会在咱们 App 的 Library/Caches 途径下创立 Breakpad 文件夹,并将生成的 dmp 文件保存在里面,如图:

使用 Google Breakpad 来助力解决程序崩溃

现在有了 dmp 文件,咱们暂时还无法去解析它,为什么?由于咱们还短少符号文件去符号化这个 dmp。

那咱们去哪里找这个符号文件呢? 打包时,iOS App 的符号文件默许情况下都存放在 xcarchive 文件中。

翻开 Xcode 的 Window -> Organizer, 然后找到对应的 archive 包,右键 Show in Finder, 文件夹 dSYMs 里即为咱们的符号文件。

使用 Google Breakpad 来助力解决程序崩溃

剖析溃散文件

在上面咱们已经编译好了 dump_syms 和 minidump_stackwalk ,接下来用这两个东西生成 symbols 文件和仓库文件。

在你合适的目录中新建一个文件夹,称号依照个人喜爱即可,然后将 dump_syms,minidump_stackwalk,dmp 和 .dSYM 文件拖进来。

生成Symbols文件:

cd 到该目录,履行如下指令:

$ ./dump_syms -a arm64 TTTT.app.dSYM > TTTT.sym

解说下,指令中的架构能够是 armv7, armv7s 等等,首要还是看你的运用是支撑的什么架构,像我的这个测验工程,它就只支撑 arm64,所以我这边就只生成 arm64 的 Symbols 文件。别的,TTTT.app.dSYM 是我这边打包生成的,需求替换你自己的 .dSYM 文件,然后生成的 .sym 文件,文件名必须与之前的 TTTT 保持一致,不然 dmp 文件就不能符号化。

检查 TTTT.sym 文件内容,履行如下:

head -n1 TTTT.sym

头部会有

MODULE mac arm64 6DD6178D3EF53F21A61BE8B5D9E294D00 TTTT

这样的字符串。

继续履行指令

mkdir -p symbols/TTTT/6DD6178D3EF53F21A61BE8B5D9E294D00 /

mv TTTT.sym symbols/TTTT/6DD6178D3EF53F21A61BE8B5D9E294D00 /

./minidump_stackwalk xxxx-xxxx-xxxx-xxx.dmp symbols > crashed.log

这样咱们就把 dmp 给剖分出来了,符号化的数据都保存在 crashed.log 中。

使用 Google Breakpad 来助力解决程序崩溃

根据图上的内容,咱们能够发现程序的溃散发生在 ViewController.m 的第24行。回到咱们的测验工程中,发现确真实 24 行,这儿发生了数组越界。

使用 Google Breakpad 来助力解决程序崩溃

由此说明,Breakpad 帮助咱们找到了程序溃散的地方,本次试验就成功啦!

最终

好了,本篇教程到此就完毕了。总体来说 Breakpad 运用起来并不费事,溃散搜集的成果也很精确,信任对很多想把产品做好的公司来说是一把利器。本篇仅是简单的讲解了一下 Google Breakpad 的运用以及 dump 解析,假如真实想把这一块做好的话还需求下一点功夫,譬如说溃散文件紧缩上传,以及服务器溃散日志解析等工作都需求自动化完成,本篇就不再赘述了,假如你有什么好的 idea,欢迎与我沟通。

我是杰少,假如您觉的我写的不错,那请给我 点赞+谈论+收藏 后再走哦!

往期文章:

  • UE4 多人游戏服务器探索
  • 运用虚幻引擎自动化东西完成自动化部署
  • 如安在 UE4 中制作一扇自动敞开的大门
  • 如安在 UE4 顶用代码去控制角色移动
  • 如何给 UE4 场景增加游戏角色
  • UE4:Android 平台开发实践指南
  • UE4 开发避坑指南(继续更新)
  • 新年开工啦,放个小焰火庆祝一下
  • 聊聊与苹果审核员的爱恨情仇(下)
  • 聊聊与苹果审核员的爱恨情仇(上)
  • 一名普通东西人的 2021 | 2021年终总结
  • 二叉树刷题总结:二叉查找树的特点
  • 二叉树总结:二叉树的特点
  • 二叉树总结:二叉树的修正与结构
  • StoreKit2 有这么香?嗯,我试过了,真香
  • 看完这篇文章,再也不怕面试官问我如何结构二叉树啦!
  • 那帮做游戏的又想让我们氪金,太坏了!
  • 手把手带你撸一个网易云音乐主页 | 适配篇
  • 手把手带你撸一个网易云音乐主页(三)
  • 手把手带你撸一个网易云音乐主页(二)
  • 手把手带你撸一个网易云音乐主页(一)
  • 代码要写注释吗?写你就输了
  • Codable发布这么久我就不学,摸鱼爽歪歪,哎~便是玩儿
  • iOS 高雅的处理网络数据,你真的会吗?不如看看这篇
  • UICollectionView 自定义布局!看这篇就够了

请你喝杯 ☕️ 点赞 + 重视哦~

  1. 阅读完记住给我点个赞哦,有 有动力
  2. 重视大众号— HelloWorld杰少,第一时间推送新姿势

最终,创造不易,假如对我们有所帮助,希望我们点赞支撑,有什么问题也能够在谈论区里评论~**

本文同步宣布于我的微信大众号,扫一扫文章底部的二维码或在微信查找 HelloWorld杰少 即可重视。