美文网首页
crash 收集分析

crash 收集分析

作者: 开了那么 | 来源:发表于2020-09-16 18:15 被阅读0次

crash 收集分析

当app发生crash时会产生crash report,查看crash记录对我们定位crash 的原因有很大的帮助,我们来看一下如何符号化、解析crash Report。

  • 符号化 就是把内存地址用可读的函数名和行数来替换,
    我们拿到的crash Report 信息一般都是堆栈信息,不可读,
    例如:


    image

    如果想要读懂crash 日志,我们就需要把日志符号化,

获取crash

1.苹果Crash收集服务
新版iTunes Connect已不能看到APP的crash日志,只能在XCode 中Window->Organizer->Crashes可以看到crash日志。

当程序运行Crash的时候,系统会把运行的最后时刻的运行信息记录下来,存储到一个文件中,也就是我们所说的Crash文件,但收集crash功能需要用户设置->隐私->诊断与用量->诊断与用量数据选择自动发送,并与开发者共享,由于不是所有用户都会把这个功能打开,所以并不能保证收集到所有的Crash信息,推荐指数三颗星。

2.自行实现Crash收集及上报框架
实现原理上面已详细描述,适合人手充足,技术储备足够的团队使用,推荐指数五颗星。

3.第三方crash收集服务
腾讯bugly、友盟等Crash收集服务比较完善,作为开发者省心省力,适合个人或者对隐私性要求不高的团队使用,推荐指数五颗星。

符号化的三种方式

编译器在把你的源代码转换成机器码的同时,也会生成一份对应的Debug符号表。Debug符号表其实是一个映射表,它把每一个藏在编译好的binary信息中的机器指令映射到生成它们的每一行源代码中。通过build setting里的Debug Information Format(DEBUG_INFORMATION_FORMAT),这些Debug符号表要么被存储在编译好的binary信息中,要么单独存储在Debug Symbol文件中(也就是dSYM文件):一般来说,debug模式构建的app会把Debug符号表存储在编译好的binary信息中,而release模式构建的app会把debug符号表存储在dSYM文件中以节省体积。
在每一次的编译中,Debug符号表和app的binary信息通过构建时的UUID相互关联。每次构建时都会生成新的唯一的能够标识那次构建的UUID,即便你用同样的源代码,通过同样的编译setting,UUID也不会相同。相应的,dSYM文件也不能用于解析其它(UUID对应的)binary信息,即便构建自于同一个源代码

1、dSYM获取方式

  • 1、从Xcode下载dSYM文件
    xcode->window->organizer->右键你的应用 show finder->右键.xcarchive 显示包内容->dSYMs->test.app.dYSM
  • 2、从iTunes Connect网站上下载dSYM文件
    打开App详情页面
    点击 Activity
    从所有的构建中,选择一个版本
    点击 下载dSYM文件的链接


    image
image
  • 3 通过mdfind工具找回
    在Bugly的issue页面查询到crash对应的UUID:

然后在Mac的Shell中,用mdfind命令定位dSYM文件:
mdfind "com_apple_xcode_dsym_uuids == <UUID>"

注意,使用mdfind时,UUID需要格式转换(增加“-”): 12345678-1234-1234-1234-xxxxxxxxxxxx 例如,要定位的dSYM的UUID为:E30FC309DF7B3C9F8AC57F0F6047D65F 则定位dSYM文件的命令如下

mdfind "com_apple_xcode_dsym_uuids == E30FC309-DF7B-3C9F-8AC5-7F0F6047D65F"
                                     |12345678-1234-1234-1234-xxxxxxxxxxxx|

建议每次构建或者发布APP版本的时候,备份App对应的dSYM文件!

2、符号化过程

  • atos命令

    atos命令可以把地址里的数字替换成等价的符号。如果调试符号信息是完备的,则atos的输出信息将会包含文件名和对应的资源行数。atos命令可以被用来单独符号化那些未符号化或者部分符号化过的crash report(中的堆栈信息里的地址)。
    想要使用atos符号化crash report可以按如下方式操作:

  • 1、找到你想要符号化的那一行,记下第二列的binary信息名,以及第三列的地址。

  • 2、从crash report底部的binary信息名列表中找到那个名字,记下来架构名和加载的地址。

atos [-arch 架构名] [-o 符号表] [-l 模块地址] [方法地址]

  • 用Xcode符号化iOS的Crash report

一般来说,Xcode会自动尝试符号化它所有的Crash report。所以你只需要把crash report加到Xcode Organizer就可以了。
Note:Xcode只认.crash后缀的crash report。如果你收到的crash report没有后缀名或者后缀是txt,在执行下列步骤之前先把它改成.crash。

从Window菜单栏选择Devices
在Devices左侧,选择一个设备
点击右边在“Device Information“ 下面的 ”View Device Logs” 按钮
把你的Crash report拖拽到左侧panel中
Xcode会自动符号化Crash report并且显示结果

为了符号化一个Crash report,Xcode需要去定位如下信息:

崩溃的app的binary信息以及dSYM文件
所有app关联的自定义framework的binary信息以及dSYM文件。如果是从app构建出来的framework,它们的dYSM会随着app的dSYM文件一起拷贝到archive中。如果是第三方的framework,你需要去找作者要dYSM文件。
发生crash时app所依赖的OS的符号表信息。这些符号表包含了特定OS版本(例如iOS9.3.3)上的framework所需调试信息。 OS 符号表的架构具有独特性——一个64位的iOS设备不会包含armv7的符号表。Xcode将要自动拷贝你连接到的特定版本的Mac的符号表。

在上述任何一处,如果没有Xcode,你将无法符号化一个crash report,或者只能部分符号化一个crash report。

例如:


image
image

参考文章:
iOS内功篇:浅谈Crash
了解和分析iOS Crash Report

相关文章

  • crash 收集分析

    crash 收集分析 当app发生crash时会产生crash report,查看crash记录对我们定位cras...

  • 记一次Crash分析

    在这里主要分析使用UIWebView导致产生crash的原因。 从我们项目的crash日志收集平台中,有诸多如下的...

  • 记一次Crash分析

    在这里主要分析使用UIWebView导致产生crash的原因。 从我们项目的crash日志收集平台中,有诸多如下的...

  • iOS crash分析相关博客

    全面的理解和分析iOS的崩溃日志念茜-漫谈iOS Crash收集框架 如何定位Obj-C野指针随机Crash(一)...

  • iOS-App上线后收集Crash问题用到的第三方·BugHD

    其实很简单其实很自然 收集 Crash 是应用开发必要的环节, 通过分析和修复 Crash 信息可以大大提高应用的...

  • iOS crash文件的获取与解析

    一、获取crash文件 1、PLCrashReporter 收集crash,stringValueForCrash...

  • 友盟crash统计

    1. 错误分析Android功能说明 1.1 概述 错误分析是友盟为移动开发者提供的Crash收集和分析工具,帮助...

  • Crash 收集

    苹果的API有个函数是NSSetUncaughtExceptionHandler(&LGExceptionHand...

  • 漫谈iOS Crash收集框架

    漫谈iOS Crash收集框架

  • ios收集crash 日志

    有很多crash日志收集的框架,例如国内的友盟。 为了保护隐私,可能需要自己收集crash。 利用程序代码收集cr...

网友评论

      本文标题:crash 收集分析

      本文链接:https://www.haomeiwen.com/subject/hiehyktx.html