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};
    

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

    总结

    要有钻研到底的精神。