如何定位Task错误码-1002的日志输出来源?
我遇到大量
Task <A3E18896-7B51-4481-A373-6C52DDD8C3BF>.<193>类日志报错误码-1002,尝试排查来源却毫无头绪:曾怀疑图片加载失败但已排除;已知-1002是NSURLConnection相关错误,但本次日志未提及该组件,此前遇到该错误时日志会关联它。示例日志如下:2018-05-18 14:59:38.406606-0600 MyApp[9635:2490206] Task <A3E18896-7B51-4481-A373-6C52DDD8C3BF>.<193> finished with error - code: -1002 2018-05-18 14:59:38.406921-0600 MyApp[9635:2490206] Task <D0CD9879-1FF8-4514-9DE7-2E4EB6492882>.<194> finished with error - code: -1002 2018-05-18 14:59:38.461969-0600 MyApp[9635:2490208] Task <D784F57A-8015-42E9-AC6B-B43B77344113>.<195> finished with error - code: -1002请问能否通过断点定位该日志输出?我尝试过创建符号断点,但不知该设置什么符号。
别担心,这些Task日志其实是NSURLSession输出的(iOS 9之后NSURLConnection被底层封装进NSURLSession了,所以日志里不会直接显示NSURLConnection),给你几个精准的断点设置方法:
首选:跟踪NSURLSession任务错误回调
打开Xcode的Breakpoint Navigator(快捷键⌘+8),点击左下角的+号选择「Symbolic Breakpoint」,输入符号:-[NSURLSessionTask taskDidCompleteWithError:]这个方法是NSURLSession任务完成且携带错误时的核心回调,系统输出那些Task错误日志前一定会调用它。你还可以给断点加个Action:选择「Log Message」,输入
Error details: %@,然后在变量里选$arg3(也就是错误对象参数),再勾选「Automatically continue after evaluating actions」,这样程序不会中断,还能直接看到更详细的错误信息。备选:跟踪CFNetwork的日志输出函数
如果上面的断点没触发,试试底层的CFNetwork日志符号:_CFNetworkLog这是负责输出这类网络日志的底层函数,设置断点后,每次输出Task错误日志时都会停下,此时查看调用栈就能找到你App里发起请求的代码位置。
进阶:过滤特定错误码
为了避免无关断点干扰,你可以给断点加条件:在断点的「Condition」里输入(int)[(NSError *)$arg3 code] == -1002这样只有错误码是-1002的时候才会触发断点,效率更高。
当断点触发时,切换到Debug Navigator(⌘+7)查看调用栈,往上找带有你App名称的代码层,就能精准定位到发起这个出错请求的业务代码了。
内容的提问来源于stack exchange,提问作者YichenBman

