项目上线后 如何快速定位到用户崩溃 卡顿的问题!

1.通常我们自己会在程序中加入友盟或者bugly来监听后期线上的运行,bugly记得上传符号表文件定位.

2.另外一种是处理测试提交给我们的一些堆栈bug信息。

先说定位bugly的卡顿崩溃信息。

 1.获取符号表文件

在 XCode中, Window->Organizer->选择提交到App Store的Archies->右键,showin finder ->右键->显示包内容,在dSYMs文件夹里的xxx.app.dSYM就是符号表文件。这里包含着debug信息

使用命令获取dsym文件的uuid,对照crash日志里的uuid,如果一致则进行下一步

2.命令: dwarfdump --uuid (xxx.app.dSYM的路径)

结果如下:UUID: EC087835-FA55-36F2-B4D9-430BF6C2BA69 (armv7) uau1.3.0.app.dSYM/Contents/Resources/DWARF/Name

UUID: 916F22F5-F3B1-3709-BB7E-5B11267B5D1F (arm64) uau1.3.0.app.dSYM/Contents/Resources/DWARF/Name

对照运行环境 找出UUID运行一致的运行环境 是arm64  armv7

3.找到错误部分

如:appName 0x000000010007528c 0x0000000100004000 + 1444580

取前者 0x000000010007528c ,后者为程序基地址,错误日志也会标出App base addr: 0x0000000100004000

一般错误位置都是在项目名后面的堆栈地址,CoreFoundation、UIKit等后面的堆栈地址无法定位

4.定位

在终端中进入.dSYM文件的所在目录下

cd /Users/01/Desktop/xxx.xcarchive/dSYMs

查找定位

命令: atos -arch (运行环境) -o (.dSYM文件包里面表单信息路径) -l (程序基地址) (错误代码地址)

错误代码地址及程序基地址的获取见上文

例:atos -arch arm64 -o appName.app.dSYM/Contents/Resources/DWARF/appName -l 0x0000000100004000 0x000000010007528

即可定位到代码位置. -[YYView init_tableview] (in xxx) (YYView.m:828) 括号里的是代码所在类别和行数

 

第二种就是直接通过堆栈地址定位到崩溃位置的信息

1.从 appName.xcarchive 里提出 appName.dSYM 和 appName文件。放到一个目录下。从打包产生的归档文件里面提出符号表文件,app名字文件

2.使用终端进入这个目录,使用 xcrun atos arm64 -o appName 0x0000000100098000

arm64是架构 ,appName是app文件,0x0000000100098000是基地址
下面详细说明

首先打开Xcode,点击最上方菜单栏的Window选项,选择Organizer,打开打包页面。
在打包页面选择崩溃的包,右键选择Show in Finder。(包一定要选对,不然内存地址定位会出错)
打开Finder页面后选择的包会显示高亮,右键,选择显示包内容。
点击显示包内容后会看到dSYNs文件夹,点进去会找到这个appName.dSYM文件,将它拷贝到一个文件里(最好是在桌面上单独创建一个crash文件夹)。然后就可以关掉这个窗口了。
点击桌面上你新建的crash文件夹,右键appName.dSYM,点击显示包内容,然后依次打开Contents-Resources-DWARF(这里就一个文件夹链),找到appName文件,将它也拷贝到crash文件夹中。
打开终端,cd crash文件夹目录(直接把文件夹拖进终端,自动显示目录),然后输入xcrun atos arm64 -o appName crashAddress
其中arm64要根据在哪个型号的机器崩溃自行确定,可能是armv7,如果是模拟器的话用i386

其实用堆文件分析有3种情况

1. 直接标出了错误位置的

3   FIR        0x000000010bfddd8c -[FIRViewController viewDidLoad] + 8588

2.未标记错误位置,有基地址的情况:

3   FIR           0x000e3e92 0xd3000 + 69266

这条调用栈包括下面四部分:
模块号: 这里是3
二进制库名: 这里是 FIR.im
调用方法的地址: 这里是 0x000e3e92
第四部分分为两列,基地址和偏移地址。此处基地址为 0xd3000,偏移地址为 69266。
使用下面的命令符号化:
atos -arch armv7 -o FIR -l 0xd3000 0x000e3e92

 结果: [FIRViewController viewDidLoad] (FIRViewController.m:156)

可以看到崩溃的类为 FIRViewController,函数为 viewDidLoad,文件名是 FIRViewController.m,行数是 156 行。

3.未标记错误位置,无基地址的情况:

3   FIR            0x000f0e97 FIR + 69271
 

计算基地址   方法地址-偏移地址

-load address = 0x000f0e97 - 69271 =0xe0000. 说一下这种计算方式 把方法地址转换成10进制数据减去偏移的地址量 就是基地址的10进制表达式,再转换成16进制表示就可以了 16进制表示前面要加0x

使用下面的命令符号化:

atos -arch armv7 -o FIR -l 0xe0000 0x000f0e97
-[FIRViewController viewDidLoad] (FIRViewController.m:156)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值