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)