Symbolicate iOS Crash Log

本文介绍的是如何处理 Xcode 无法自动 Symbolicate 的 Crash log。

如果你得到这样的 Crash log,你一定想知道其中的 0x4a000 + 37204 究竟对应哪个方法调用。

1
2
3
4
5
6
7
0   CoreFoundation                  0x2dc73f7e __exceptionPreprocess + 126
1 libobjc.A.dylib 0x384eecca objc_exception_throw + 34
2 CoreFoundation 0x2dc77912 -[NSObject(NSObject) doesNotRecognizeSelector:] + 198
3 CoreFoundation 0x2dc761fe ___forwarding___ + 702
4 CoreFoundation 0x2dbc5764 _CF_forwarding_prep_0 + 20
5 YourAppName 0x00053154 0x4a000 + 37204
6 UIKit 0x306f1c52 -[UIApplication _sendWillEnterForegroundCallbacks] + 90

首先计算 symbol address

由下面这个公式得来:

slide + stack address - load address = symbol address

在上面的 Crash log 中的第 5 行中,0x4a000 就是 load address,0x4a000 + 37204 是 stack address。

现在缺少的是 slide。

下载应用的 .ipa 文件解压,会得到 Payload 目录,在此目录中执行下面的命令:

1
otool -arch armv7 -l YourAppName.app/YourAppName | grep -B 1 -A 10 "LC_SEGM" | grep -B 3 -A 8 "__TEXT"

会得到类似下面的结果:

1
2
3
4
5
6
7
8
9
10
11
12
Load command 1
cmd LC_SEGMENT
cmdsize 736
segname __TEXT
vmaddr 0x00004000
vmsize 0x00314000
fileoff 0
filesize 3227648
maxprot 0x00000005
initprot 0x00000005
nsects 10
flags 0x0

其中的 vmaddr 即 silde。

然后计算 symbol address (可以用 Google),在本例中就是:

0x00004000 + 37204 = 0xD154

最后执行:

1
atos -arch armv7 -o YourAppName.app/YourAppName 0xD154

就可以得到崩溃中与自己编写的逻辑相关的代码。

给鸡排饭加个蛋