内容分别摘自http://www.jianshu.com/p/17fd659df460
http://www.jianshu.com/p/fd537d2dde89 http://www.jianshu.com/p/746184ea5662
崩溃分析
加入友盟统计功能后,友盟后台会有一个错误分析的统计项,点进去之后可以查看项目的错误报告, 错误报告如下
-[NSNull count]: unrecognized selector sent to instance 0x3a491a60
(null)
(
0 CoreFoundation 0x2f981e9b + 154
1 libobjc.A.dylib 0x39cde6c7 objc_exception_throw + 38
2 CoreFoundation 0x2f9857b7 + 202
3 CoreFoundation 0x2f9840af + 706
4 CoreFoundation 0x2f8d2dc8 _CF_forwarding_prep_0 + 24
5 WeChatHelper WeChatHelper + 245693
6 WeChatHelper WeChatHelper + 26969
7 libdispatch.dylib 0x3a1c30c3 + 10
8 libdispatch.dylib 0x3a1c30af + 22
9 libdispatch.dylib 0x3a1c59a9 _dispatch_main_queue_callback_4CF + 268
10 CoreFoundation 0x2f94c5b1 + 8
11 CoreFoundation 0x2f94ae7d + 1308
12 CoreFoundation 0x2f8b5471 CFRunLoopRunSpecific + 524
13 CoreFoundation 0x2f8b5253 CFRunLoopRunInMode + 106
14 GraphicsServices 0x345ef2eb GSEventRunModal + 138
15 UIKit 0x3216a845 UIApplicationMain + 1136
16 WeChatHelper WeChatHelper + 391591
17 libdyld.dylib 0x3a1d7ab7 + 2
)
dSYM UUID: A925ED33-1D32-392F-BD92-52623DCE51A3
CPU Type: armv7s
Slide Address: 0x00004000
Binary Image: WeChatHelper
Base Address: 0x00059000
1、首行为错误原因
2、如第5行WeChatHelper为工程名(app名)
3、淡绿色为错误代码的地址
4、dSYM UUID,这个是dSYM文件的唯一标识。dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件。
5、CPU Type. 定位错误的时候,我们也需要用到这个参数。
定位错误代码,我们需要将 xx.app 和 xx.app.dSYM 文件找出来.
1、在Windows->Organizer->archivers可以看到你的每一次的打包。然后选择你要查看的错误报告所在的版本。
2、show in Finder
3、再右键选择显示包内容,这时我们看到 有dSYMs,Products,SCMBlueprint三个文件夹,需要用到的是前两个文件夹。
4、此时,将这俩文件夹中最里层的文件都取出来,放到一个新的文件夹中
方一
5、.打开终端,cd到刚才新建的文件夹(错误报告)的目录下
输入命令xcrun atos -arch armv7s -o xxxx.app/xxxx 0x10019bc48
armv7s 是友盟错误里面的 CPU Type: armv7s
xxxx对应的是你的工程名
0x0004af6f 是错误信息地址、淡绿色的那个内存地址
-[SubscribeViewController isSubcribeSuccess:] (in woshiPM) (SubscribeViewController.m:342)就是错误代码的位置,在SubscribeViewController.m中的isSubcribeSuccess方法中,342是代码所在的行数。
方二:
下面这是项目里通过友盟统计到的崩溃日志,如果光看这些日志报告的话,是不会知道是哪行代码引起的。使用方法是把对应版本(上文所述show in Finder 后看到的文件)的.xcarchive文件拖到工具。对比UUID和友盟里日志是否一致,一致就把错误的地址信息拷贝到箭头处。
即可得出具体代码崩溃位置。
1、1.将打包发布软件时的xcarchive文件拖入软件窗口内的任意位置(支持多个文件同时拖入,注意:文件名不要包含空格) PS. 位置 : /Users/用户名/Library/Developer/Xcode/Archives
2.选中对应版本的xcarchive文件,右边会列出该xcarchive文件支持的CPU类型,选中错误对应的CPU类型。
3.对比错误给出的UUID和工具界面中给出的UUID是否一致。
4.将错误地址以及 Slide Address 输入工具的文本框中,点击分析。
dSYM分析工具 传送门 :GitHub - answer-huang/dSYMTools: dSYM analyze
举例 : 对应友盟 错误详情 截图, 将 dSYM的UUID, 首次错误内存地址, Slide Arrdress, CPU Type 填入该应用中
可以看到错误定位 在 240行, 为方法中的具体代码, 分析错误类型, 对比代码, 解决问题
还有一种崩溃日志如下(看不到具体位置):
*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array
*2016-10-19 21:48:02---[
0 CoreFoundation 0x0000000186d325b8 (redacted) 160,
1 libobjc.A.dylib 0x00000001974400e4 objc_exception_throw 60,
2 CoreFoundation 0x0000000186c1762c (redacted) 0,
3 GyyxGuangYuTong 0x00000001000e79e0 GyyxGuangYuTong 440800,
4 UIKit 0x000000018b60cca4 (redacted) 1280,
5 UIKit 0x000000018b6ca5f0 (redacted) 276,
6 UIKit 0x000000018b566e80 (redacted) 356,
7 UIKit 0x000000018b4d8794 (redacted) 532,
8 CoreFoundation 0x0000000186ceaa50 (redacted) 32,
9 CoreFoundation 0x0000000186ce79dc (redacted) 360,
10 CoreFoundation 0x0000000186ce7dbc (redacted) 836,
11 CoreFoundation 0x0000000186c150a4 CFRunLoopRunSpecific 396,
12 GraphicsServices 0x000000018fdbf5a4 GSEventRunModal 168,
13 UIKit 0x000000018b54a3c0 UIApplicationMain 1488,
14 GyyxGuangYuTong 0x0000000100098854 GyyxGuangYuTong 116820,
15 libdyld.dylib 0x0000000197aaea08 (redacted) 4 ]
注意这一行
3 GyyxGuangYuTong 0x00000001000e79e0 GyyxGuangYuTong 440800,
14 GyyxGuangYuTong 0x0000000100098854 GyyxGuangYuTong 116820,
我们要找具体的崩溃地方就要从这里来找。
GyyxGuangYuTong 这个是app名 也就是你的app的名字
0x00000001000e79e0 这个是崩溃的内存地址
440800 这个应该是一个偏移量
以上情况在使用dsym工具时:
随便选择一个版本,错误内存地址就填写上面的0x00000001000e79e0,而slide Address 需要计算:slide Address十进制= 0x00000001000e79e0 转换十进制 - 后面的偏移量,然后将slide Address十进制 转换为十六进制,注意计算的时候把0X去掉 这是16进制的标志~~~,那就是00000001000e79e0
转换后的十进制为4295916000 然后- 偏移量440800,得到十进制address:4 295 475 200,转换为16进制:0x10007c000
然后点击分析