有一次去看友盟统计表,发现记录的很多崩溃统计,都看不太懂,也看不到具体崩溃的代码,所以去网上寻找定位崩溃代码的办法,下面是我觉得比较好的一种办法:
崩溃记录:
-[__NSArrayM overRect]: unrecognized selector sent to instance 0x1742528a0
(null)
((
0 CoreFoundation 0x00000001888aaff0 <redacted> + 148
1 libobjc.A.dylib 0x000000018730c538 objc_exception_throw + 56
2 CoreFoundation 0x00000001888b1ef4 <redacted> + 0
3 CoreFoundation 0x00000001888aef4c <redacted> + 916
4 CoreFoundation 0x00000001887aad2c _CF_forwarding_prep_0 + 92
5 Butler 0x100036f0c Butler + 225036
6 AVFoundation 0x00000001902f3310 <redacted> + 308
7 AVFoundation 0x00000001902f314c <redacted> + 100
8 CoreMedia 0x000000018b1c8f68 <redacted> + 260
9 CoreMedia 0x000000018b1e7e9c <redacted> + 224
10 libdispatch.dylib 0x00000001877629a0 <redacted> + 16
11 libdispatch.dylib 0x000000018776f604 <redacted> + 448
12 libdispatch.dylib 0x000000018777bc1c <redacted> + 204
13 libdispatch.dylib 0x00000001877648a0 <redacted> + 804
14 libdispatch.dylib 0x0000000187770964 <redacted> + 560
15 libdispatch.dylib 0x00000001877662cc <redacted> + 884
16 libdispatch.dylib 0x0000000187770964 <redacted> + 560
17 libdispatch.dylib 0x00000001877662cc <redacted> + 884
18 libdispatch.dylib 0x0000000187771950 <redacted> + 256
19 libdispatch.dylib 0x0000000187778170 <redacted> + 760
20 libsystem_pthread.dylib 0x000000018796b08c _pthread_wqthread + 772
21 libsystem_pthread.dylib 0x000000018796ad7c start_wqthread + 4
)
dSYM UUID: 7170B52B-0F44-32E0-B89A-C900C55AB3BE
CPU Type: arm64
Slide Address: 0x0000000100000000
Binary Image: Butler
Base Address: 0x00000001000cc000
类似这样的崩溃记录,由于不是必现的,一时很难找到崩溃的地方,下面就让我们一步一步的来找到崩溃的代码:
第一步:找到当时上传代码时使用的DYSM文件,这文件通常在.xcarchive文件中。 右键XXX.xcarchive文件, 然后通过终端(Terminal)工具打开。
第二步:进入到XXX.xcarchive文件的DWARF目录,下面是目录
~/Butler.xcarchive/dSYMs/XXX.app.dSYM/Contents/Resources/DWARF
第三步:然后执行下面的命令.就可以看到这处内存地址反编译回来的源码行。
//第一个YYYY表示CPUType(比如上面的arm64,跟友盟错误信息里的一致),XXX是崩溃统计里Binary Image所对应的名字,后面的是崩溃的内存地址
atos -arch YYYY -o XXX 0x1153b9
运行结果:
➜ DWARF atos -arch arm64 -o Butler 0x100036f0c
-[XJHPlateIDScanViewController captureOutput:didOutputSampleBuffer:fromConnection:] (in Butler) (XJHPlateIDScanViewController.mm:154)
这样就可以看到崩溃的代码了!!!
最后注意:如果定位到的地址是UmengSignalHandler,这个不是错误,是捕捉crash的方法,本身不引起crash, 当crash发生时由它来捕捉,直接忽略crash log中的 UmengSignalHandler 部分即可。