symbolicatecrash deadloop bug

背景

去年写过一篇文章,里面讲了如何使用symbolicatecrash工具符号化崩溃信息。

当时基于这个方法,给公司的产品实现了一个自动符号化崩溃信息的小系统。

  • App获取崩溃信息后,打包上传到公司收集崩溃的服务器。
  • Python脚本定时获取崩溃,并在内网Jenkins服务器上找到对应版本的符号文件。
  • 最后符号化后,汇总到数据库中。
  • Web方便查询,按模块、版本、堆栈等汇总。方便查找崩溃原因,及跟踪崩溃趋势。

问题

然而,一直有个问题,symbolicatecrash在分析某些崩溃(大概崩溃总数的1/3)时会出现CPU 100%,且永远不结束 的情况。(永远不结束,是猜测,因为跑过好几次一晚上,最后只能结束进程)。symbolicatecrash是Perl脚本,perl进程CPU占用一直100%。

猜测应该是这个perl脚本的问题,但各种搜索竟然没有找到结果。

临时解决办法:分析崩溃超过15s就结束这个分析进程。也就有了这个博客

然而这样解决会导致只能分析出大约2/3的崩溃。问题很严重,不过也忍了。

解决

这小半年过去了,想来再试着解决下。

同事发现一篇文章 ,激动的马上拿来试试。(文章是9月底写的,大概正好是我放弃查找的时候……)

这是由于xcode提供的symbolicatecrash对于重复image的日志会出现死循环。

修改symbolicatecrash文件


Xcode7.2 及以前: /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

参考:https://forums.developer.apple.com/thread/43489


将以下代码:


                # add ourselves to that chain
                $images{$nextIDKey}{nextID} = $image{base};

                # and store under the key we just recorded
                $bundlename = $bundlename . $image{base};

替换为:


            if ($image{uuid} ne $images{$bundlename}{uuid}) {

                # add ourselves to that chain
                $images{$nextIDKey}{nextID} = $image{base};

                # and store under the key we just recorded
                $bundlename = $bundlename . $image{base};

于是就解决了。不知苹果为什么不修改这个问题。

总结

要有钻研到底的精神。