如果你得到这样的 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
|
就可以得到崩溃中与自己编写的逻辑相关的代码。