此错误日志只做例子,教你如何分析和定位错误,教你方法,并不具有实际意义哦~~~

很多人对如下问题一头莫展

bugly 将错误日志上传 iOS ios报错日志_bugly 将错误日志上传 iOS

现在就以此错误日志教大家如何看错误日志定位异常位置。

UMLOG: error: session_id=092DA7955F41A8B79725FF3ACC72CDAD, context=*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]

(null)

((

0   CoreFoundation                      0x00000001c4aecedc <redacted> + 252

1   libobjc.A.dylib                     0x00000001c3cbda40 objc_exception_throw + 56

2   CoreFoundation                      0x00000001c4a64494 _CFArgv + 0

3   CoreFoundation                      0x00000001c49ea980 <redacted> + 352

4   CoreFoundation                      0x00000001c49db4c4 <redacted> + 64

5   MyApp                           0x000000010305b484 -[YQPBaseLiveRoomWebUIController(YQPJsHelper) evaluateCallBackName:data:] + 192

6   MyApp                           0x0000000102ff44bc -[YQPLiveRoomManagerViewController onUserDataChanged:] + 84

7   MyApp                           0x000000010314dee4 __41-[AgoralManager(JoinHelper) postHeatRoom]_block_invoke + 784

8   MyApp                           0x000000010309193c __59+[NetworkingHelper postPartyRoomHeartRoomParam:completion:]_block_invoke + 208

9   MyApp                           0x00000001031a2a1c +[NetWorkingTools postResponseData:completion:] + 320

10  MyApp                           0x00000001031a2224 __97+[NetWorkingTools postUrl:parameters:isAddToken:isCache:isTopUp:completionCacheBlock:completion:]_block_invoke.69 + 136

11  MyApp                           0x00000001030402ac __65+[PPNetworkHelper POST:parameters:responseCache:success:failure:]_block_invoke_2 + 540

12  MyApp                           0x000000010324b7e8 __116-[AFHTTPSessionManager dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure:]_block_invoke.124 + 212

13  MyApp                           0x000000010326d8a0 __72-[AFURLSessionManagerTaskDelegate URLSession:task:didCompleteWithError:]_block_invoke_2.117 + 224

14  libdispatch.dylib                   0x000000010590b824 _dispatch_call_block_and_release + 24

15  libdispatch.dylib                   0x000000010590cdc8 _dispatch_client_callout + 16

16  libdispatch.dylib                   0x000000010591a814 _dispatch_main_queue_callback_4CF + 748

17  CoreFoundation                      0x00000001c4a7cdf4 <redacted> + 12

18  CoreFoundation                      0x00000001c4a77cbc <redacted> + 1964

19  CoreFoundation                      0x00000001c4a771f0 CFRunLoopRunSpecific + 436

20  GraphicsServices                    0x00000001c6cf0584 GSEventRunModal + 100

21  UIKitCore                           0x00000001f1c834c0 UIApplicationMain + 212

22  YiQiParty                           0x0000000102f668a0 main + 124

23  libdyld.dylib                       0x00000001c4536bb4 <redacted> + 4

)

 

dSYM UUID: FFE9EB2B-6912-3A87-9251-908267EBA0C9

CPU Type: arm64

Slide Address: 0x0000000100000000

Binary Image: YiQiParty

Base Address: 0x0000000102f48000

这个日志是从友盟统计上copy下来的。

从错误日志中一眼就看出来了,这是一个往字典中插入入了一个value为nil的对象造成的,对value做一个非空处理就行了。

说起来貌似很简单,做起来也很简单,但是找到位置对于不会看日志的人来说就是大海捞针了,因为app上线后,用户的各种奇葩操作,出现的问题,也不能下断点调试。

下来我大概说一下该怎么看日志,具体来说是怎么定位闪退/异常的具体位置:

首先代码是一行一行的执行的,日志也是从前往后记录的,那么也就是我们看日志的时候要倒着看,也就是在最后往前看,也就是先定位这个异常是在最外层的哪个方法位置调用的,然后层层深入,知道锁定到具体位置,为什么是这样的呢,打个比方,你有异常的代码正好是一个工具类方法,在很多地方都被调用了,你直接修改这个方法,你也不知道为啥会出现,当然你可以 完善你的这个工具类方法,就当我没说。

好了,废话就不多说了,从上面的异常倒着看,20....14都是系统运行日志,就直接跳过,到13可以看到

0x000000010326d8a0 __72-[AFURLSessionManagerTaskDelegate URLSession:task:didCompleteWithError:]_block_invoke_2.117 + 224

有眉目了,这事afnetworking网络请求的地方出错了,无外呼是请求出错了,也有可能是请求结束后在block体里对结果处理时异常了

我们继续往下看12:

0x000000010324b7e8 __116-[AFHTTPSessionManager dataTaskWithHTTPMethod:URLString:parameters:uploadProgress:downloadProgress:success:failure:]_block_invoke.124 + 212

这个依然是进一步问题,确定了是网络请求的时候出问题的,已经到了AFHTTPSessionManager类,这是afn的最外层接口了,我们继续往下看11

0x00000001030402ac __65+[PPNetworkHelper POST:parameters:responseCache:success:failure:]_block_invoke_2 + 540

看到PPNetworkHelper类,立马就开心了,终于到我自己的类,这是我对afn的第一次封装类,主要是封装afn的各类接口,对外留上几个主要类以及网络监听回调的。继续往下看10

0x00000001031a2224 __97+[NetWorkingTools postUrl:parameters:isAddToken:isCache:isTopUp:completionCacheBlock:completion:]_block_invoke.69 + 136

看到NetWorkingTools类,这是我对afn的第二层封装,主要是处理全局错误码的,对一写特殊错误码做特殊归类以及对token处理的。继续往下看9:

0x00000001031a2a1c +[NetWorkingTools postResponseData:completion:] + 320

看到这,还是NetWorkingTools,postResponseData:completion是在第10条类的方法回调体里进一步处理结果的方法,到这基本就可以确定这是网络请求结果处理的时候异常了,也就是在处理结果的时候比如有空数据添加到某个字典里导致闪退了。现在就是确定哪个地方的网络请求了,继续往下看8:

0x000000010309193c __59+[NetworkingHelper postPartyRoomHeartRoomParam:completion:]_block_invoke + 208

NetworkingHelper是我对网络的请求的第三层封装,主要是处理传入的url,以及选择何种网络请求(比如是下载还是post、get,以及是否需要缓存等等),以及对结果进行模型转换的地方(当然也可以选择不转换模型,这层是对外调用的地方,外接只穿请求的param就可以了),继续往下看7:

0x000000010314dee4 __41-[AgoralManager(JoinHelper) postHeatRoom]_block_invoke + 784

AgoralManager(JoinHelper)这个是我自己封装处理声网sdk的一个管理类的一个扩展类,主要是处理声网的加入房间整个过程的一个处理类,以及心跳处理的的类,因为停止心跳或者掉线了要重新加入房间的,所以心跳也归属到此类了,然后看到postHeatRoom,就很明显了,问题就是处在心跳网络请求成功后的block体里处理数据出问题了,继续往下看6:

0x0000000102ff44bc -[YQPLiveRoomManagerViewController onUserDataChanged:] + 84

onUserDataChanged是代理方法,拿到结果后的代理方法,传递出结果给遵守代理的类YQPLiveRoomManagerViewController。继续往下看5:

0x000000010305b484 -[YQPBaseLiveRoomWebUIController(YQPJsHelper) evaluateCallBackName:data:] + 192

到这就确定了这个是onUserDataChanged代理触发后调用evaluateCallBackName:data接口给h5传递刚才网络请求返回结果的方法,而在此组合data的时候value为nil,也就是网络请求后台返回了空数据,然后在我和h5交互组合json的时候,这个数据恰好是字典的value导致闪退了。到此就结束了,至于4....1都foundation框架的,不用管了。

轻松搞定,是不是很简单就定位到具体位置啦,而且还明白了在哪个地方调用导致的,因为evaluateCallBackName:data方法就是我和h5交互的公共接口,如果你只看第5条,找到这个工具方法,你根本不知道哪个地方传过来了一个空数据,也不知道什么数据是空的。所以一定要倒着看,当然对于熟练的人,憋一眼就知道什么问题啦,习惯就好,看多了,错误日志也还是蛮漂亮的嘛。??