上篇 我们写了Andriod符号表解析,当对来说十分简单。(几乎都是纯java的东西)
IOS符号解析相对来说比较困难。
IOS符号表为 .sYDM文件(夹)
1,大小
mapping文件一般100-150K左右,大一些的一般不会超过1M
而 .sYDM文件一般2M以上,如果工程较大,可能会超过30M
2,解析方式
不同于Android的几乎纯java的解析,很明了的对应关系
IOS解析目前比较好用的是用IOS系统自带atos工具。
IOS符号表崩溃信息大概长这个样子
0 CoreFoundation 0x0000000185432d8c 0x1852ed000 + 1334668 (<redacted> + 228)
1 libobjc.A.dylib 0x00000001845ec5ec 0x1845e4000 + 34284 (objc_exception_throw + 56)
2 CoreFoundation 0x00000001853cb750 0x1852ed000 + 911184 (<redacted> + 112)
3 CoreFoundation 0x0000000185479a84 0x1852ed000 + 1624708 (<redacted> + 132)
4 GSD_WeiXin(wechat) 0x00000001026d5908 0x1026c4000 + 71944
5 UIKit 0x000000018f04ae64 0x18eff8000 + 339556 (<redacted> + 1020)
6 UIKit 0x000000018f04aa50 0x18eff8000 + 338512 (<redacted> + 28)
7 UIKit 0x000000018f388380 0x18eff8000 + 3736448 (<redacted> + 1128)
8 UIKit 0x000000018f0f7a4c 0x18eff8000 + 1047116 (<redacted> + 708)
9 UIKit 0x000000018f0f76a4 0x18eff8000 + 1046180 (<redacted> + 164)
10 UIKit 0x000000018f0eb3a8 0x18eff8000 + 996264 (<redacted> + 188)
11 UIKit 0x000000018f0436f4 0x18eff8000 + 308980 (<redacted> + 1420)
12 QuartzCore 0x00000001895b9fec 0x189497000 + 1191916 (<redacted> + 184)
13 QuartzCore 0x00000001895be17c 0x189497000 + 1208700 (<redacted> + 324)
14 QuartzCore 0x000000018952a830 0x189497000 + 604208 (<redacted> + 320)
15 QuartzCore 0x0000000189552364 0x189497000 + 766820 (<redacted> + 580)
16 UIKit 0x000000018f301598 0x18eff8000 + 3184024 (<redacted> + 256)
17 CoreFoundation 0x00000001853da910 0x1852ed000 + 973072 (<redacted> + 32)
18 CoreFoundation 0x00000001853d8238 0x1852ed000 + 963128 (<redacted> + 412)
19 CoreFoundation 0x00000001853d8884 0x1852ed000 + 964740 (<redacted> + 1436)
20 CoreFoundation 0x00000001852f8da8 0x1852ed000 + 48552 (CFRunLoopRunSpecific + 552)
21 GraphicsServices 0x00000001872dd020 0x1872d2000 + 45088 (GSEventRunModal + 100)
22 UIKit 0x000000018f315758 0x18eff8000 + 3266392 (UIApplicationMain + 236)
23 GSD_WeiXin(wechat) 0x0000000102706bdc 0x1026c4000 + 273372
24 libdyld.dylib 0x0000000184d89fc0 0x184d89000 + 4032 (<redacted> + 4)
而IOS的架构方式,又有很多种,例如:armv7,arm64 等
IOS符号表 自带UUID,可以在崩溃信息上传时候附带UUID,以保证再次解析时候,二者能够匹配
具体如何解析呢?
使用dwarf工具来调用 atos
java -jar dwarf.jar atos -i "符号表" -a "待解析的内存地址" -arch armv7
PS:这里有个坑,执行结果的顺序可能会和输入的顺序不一致