2019-05-09: Crash本地符号化一:symbolic

2019-05-10  本文已影响0人  9801525d260a

一:Crash-本地符号化1:symbolicatecrash

  • 1.symbolicatecrash是xcode自带的符号表工具
  • 2: 准备工作:
    2.1: crash文件(没有符号化的crash文件:16进制的字符)
    2.2: 复制dSYM文件
    2.3: 准备symbolicatecrash工具
    2.4: copy xcode编译好的项目.app

二: 操作步骤

1: 导出真机crash文件?

1: xcode连接真机 -> window -> Devices and simulators -> View Device Logs


1.png
2.png

说明 :(还有一点就是如果打包的电脑跟你解析crash的电脑是同一个的话,那么这里导出的日志应该是解析好的,这是因为在打包的时候会建立 .app 及 .dYSM 两个文件的索引,所以可以自动解析 crash log 文件,要是没解析的话估计需要自己按照下面的方法解析了。)

2: 复制dSYM文件?

解读:其实是一个目录,在子目录中包含了一个16进制的保存函数地址映射信息的中转文件,所有Debug的symbols都在这个文件中(包括文件名、函数名、行号等),所以也称之为调试符号信息文件

1: 连接真机 -> window -> Organizer -> 选择对应的archiver的应用、如果没有archiver项目、请上传一下。


1.png
2.png
3.png

3: 复制 xcode编译好的项目.app

解读:xxx.app(一般这个文件是隐藏后缀名的)

1: 将我们真机编译出来的app复制一份出来到桌面


1.png
2.png

2: 方式2: 也如上面DSYM文件获取一样:
Xcode->Window->Organizer找到Archives->右击Show in Finder->右击.xcarchive文件->显示包内容在Products->Applications文件夹中找到xxx.app


001.png

3: 方式3:修改ipa包后缀名为.zip,解压完后的Payload里面就是xxx.app文件(注意:ipa包必须是你出现crash设备安装的ipa包)

4: 找到symbolicatecrash工具

1: 首先找到symbolicatecrash工具存放的地址

1.打开终端输入以下命令:
find /Applications/Xcode.app -name symbolicatecrash -type f

显示结果如下:
====WatchSimulator
/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

====AppleTV
/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

====iPhoneSimulator
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTFoundation.framework/symbolicatecrash

====看作真机
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

我们获取到最后一条:
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

5: 开始合成新的符号化的crash日志report

1: 将上述4个文件放在一个新目录下,比如桌面新建一个文件为crash文件夹,都放在这里面:


1.png

2: 确保三个文件的uuid是一致的
dwarfdump --uuid xxx.app/xxx
dwarfdump --uuid xxx.app.dSYM
crash文件打开后Binary Images:后面第一个大长串就是crash文件的uuid

1:  dwarfdump --uuid DSYM文件或者文件路径
dwarfdump --uuid TestCrashDemo.app.dSYM/

2: dwarfdump --uuid dwarfdump --uuid TestCrashDemo.app/TestCrashDemo

3: Binary Images: 后面第一个大长串就是crash文件的uuid:c011521c6f073688935b713e85e4631c
Binary Images:
0x104938000 - 0x1080affff BMWOne arm64  <c011521c6f073688935b713e85e4631c> /var/containers/Bundle/Application/8C2636F3-99A8-4D9A-A773-DC04BF1E67D5/BMWOne.app/BMWOne
111.png
222.png

3: 三个UUID一致的话就可以利用下面的命令解析:(./symbolicatecrash+.crash文件路径+.app.dSYM路径+>+Log.crash 这几个最好用空格分开,路径用全路径,解析的结果就是Log.crash)

cd crash文件夹(刚才自己创建的)

  • 3.1 执行命令:./symbolicatecrash 拖入准备符号化的crash文件 拖入DSYM文件 > 新的log文件名
如:
/symbolicatecrash /Users/我的电脑名/Desktop/crash/CrashDemo\ \ 2019-5-9\ 下午11-23.crash /Users/我的电脑名/Desktop/crash/CrashDemo.app.dSYM > log.crash
  • 3.2: 显示报错:Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
  • 3.3查询环境变量
    xcode-select -print-path
    显示"/Applications/Xcode.app/Contents/Developer/"
    在终端输入命令:
    export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”
export DEVELOPER_DIR=”/Applications/XCode.app/Contents/Developer”
  • 3.4: 重新操作3.1步骤,成功生成新的log文件(符号化之后的日志文件)

三:注意事项:

1: 【xxx.app.dSMY xxx.app xxx.crash】uuid要一致

四:优秀文章:

完整文章1

dSYM解析工具1

Crash文件结构说明1

debug编译符号表怎么获取

atos工具使用格式



五:线上Crash采集:第三方平台和开源框架?

5.1: 第三方统计crash

1: 国内

  • 1:友盟(阿里)
  • 2:Bugly(腾讯)
  • 3:网易云捕

2:国外

  • 1:Crashlytics(Twitter)
  • 2:Flurry(Yahoo)
5.2 原理?

1: 均是根据系统产生的crash日志进行一次提取或封装、将封装后的crash文件上传到对应的服务器进行解析并统计展示。

5.3: 开源框架?

1: iOS常用的crash收集开源框架有:

  • 1: PLCrashReporter
  • 2: KSCrash
  • 3: CrashKit
  • 4: Countly
    谢谢:具体使用可以直接在github上进行查看

六:线上Crash 统计:第三方?

1: 业界Crash统计一般有两种方案

  • 1: 自己搭建服务器、上传应用信息和崩溃数据(不推荐: 成本太大)
  • 2: 采用第三方平台、进行Crash数据采集和统计、包括分析一体化
    例如:可以使用国内的友盟(阿里)、Bugly(腾讯);国外的Crashlytics(Twitter)

七:线上线下Crash 分析?

1: 一份Crash日志是由一下7部分组成:

  • 1: 进程信息: process info
  • 2: 基本信息: Basic info
  • 3: 异常信息: Exception info
  • 4: 线程回溯: Thread backtracking
  • 5: 堆栈信息(核心关注): Stack info
  • 6: 线程状态:Thread status
  • 7: 动态库信息: Binary info
7.1 进程信息: process info

崩溃进程相关信息

  • 1: Incident Idendifier: 这是Crash唯一标识ID
    如12E38879-3EC9-4F1A-B20C-F0695C514689
  • 2: CrashReporter key: 这是映射到设备的唯一key
    如69f2f3e9acd9b5df38d2c8c59844a69adc303149,如果多个Crash拥有相同的key,说明这系列Crash只发生在一个或少数几个设备上。
  • 3: Hardware model: 设备类型
    如:iPhone8,2。如果很多Crash log都来自相同的设备、说明我们的应用在特定设备上存在问题
  • 4: Process: 应用名称
    如AlipayWallet [13563],里面的数字代表Crash时的PID
  • 5: Path: 应用在手机中的路径
    如:/private/var/containers/Bundle/Application/DC064759-9874-448C-AFB9-A4144D36F75D/AlipayWallet.app/AlipayWallet
  • 6: Identifier: 应用Bundle ID
    如:com.alipay.iphoneclient
  • 7: Code Type: 代码类型
    如:ARM-64 (Native)
7.2 基本信息: basic info

崩溃设备基本信息、包括闪退发生的日期和时间、设备的iOS版本等

  • 1: Date/Time: Crash发生时间
    如:2019-05-09 22:08:59.3018 +0800
  • 2: Launch Time: App 启动时间
    如:2019-05-09 22:08:51.7129 +0800
  • 3: OS Version: iOS 版本
    如:iPhone OS 12.1.4 (16D57),12.1.4 为系统版本, 16D57位Build号
7.3: 异常信息:Exception info

Crash时异常类型、异常码和抛出异常的线程

  • 1: Exception Type: 异常类型
    如:EXC_CRASH (SIGKILL)
  • 2: Exception Codes: 异常码
    如:0x0000000000000000, 0x0000000000000000
  • 3: Triggered by thread: 异常发生的线程
7.4: 线程回溯:Thread backtracking

提供应用中所有线程的回溯日志

7.5: 堆栈信息:Stack info

我们分析Crash最重要的信息,可以帮助我们快速定位Crash位置和原因,这些信息都保存在.dSYM 文件中

7.6: 线程状态:Thread state

Crash时寄存器中的值,一般可忽略
如:Thread 0 crashed with ARM Thread State (64-bit):

7.7: 动态库信息:Binary info

包括模块起始地址、模块结束地址、动态库名称、指令集种类、UUID、安装路径等信息、在后面符号化时需要用到。

7.8: Crash符号化分析工具?

  • 1: Xcode IDE
  • 2: symbolicationcrash
  • 3: 命令行工具atos
    格式:atos -o (dsym文件路径) -l (模块load地址) -arch (指令集种类调用方法的地址:如armv6、armv7、armv7s、arm64)
  • 4: 第三方工具:
    1: dSYMTools
    2: SYM
上一篇下一篇

猜你喜欢

热点阅读