dSYM 文件分析工具

来到新公司后,前段时间就一直在忙,前不久 项目 终于成功发布上线了,最近就在给项目做优化,并排除一些线上软件的 bug,因为项目中使用了友盟统计,所以在友盟给出的错误信息统计中能比较方便的找出客户端异常的信息,可是很多像数组越界却只给出了 *** -[__NSArrayM objectAtIndex:]: index 50 beyond bounds [0 .. 39]' 这类错误信息,如下图所示:

errorInfo

遇到这种问题如果通过 objectAtIndex 去检索错误的地方那将会是一个巨大的工作量。

dSYM 文件

什么是 dSYM 文件

Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编译项目的时候都会生成一个新的 dSYM 文件,位于 /Users/<用户名>/Library/Developer/Xcode/Archives 目录下,对于每一个发布版本我们都很有必要保存对应的 Archives 文件 ( AUTOMATICALLY SAVE THE DSYM FILES 这篇文章介绍了通过脚本每次编译后都自动保存 dSYM 文件)。

dSYM 文件有什么作用

当我们软件 release 模式打包或上线后,不会像我们在 Xcode 中那样直观的看到用崩溃的错误,这个时候我们就需要分析 crash report 文件了,iOS 设备中会有日志文件保存我们每个应用出错的函数内存地址,通过 Xcode 的 Organizer 可以将 iOS 设备中的 DeviceLog 导出成 crash 文件,这个时候我们就可以通过出错的函数地址去查询 dSYM 文件中程序对应的函数名和文件名。大前提是我们需要有软件版本对应的 dSYM 文件,这也是为什么我们很有必要保存每个发布版本的 Archives 文件了。

如何将文件一一对应

每一个 xx.app 和 xx.app.dSYM 文件都有对应的 UUID,crash 文件也有自己的 UUID,只要这三个文件的 UUID 一致,我们就可以通过他们解析出正确的错误函数信息了。

1.查看 xx.app 文件的 UUID,terminal 中输入命令 :

dwarfdump --uuid xx.app/xx (xx代表你的项目名)

2.查看 xx.app.dSYM 文件的 UUID ,在 terminal 中输入命令:
dwarfdump --uuid xx.app.dSYM 

3.crash 文件内第一行 Incident Identifier 就是该 crash 文件的 UUID。

dSYM工具

于是我抽了几个小时的时间将这些命令封装到一个应用中,也为以后解决bug提供了便利。

使用步骤:

1.将打包发布软件时的xcarchive文件拖入软件窗口内的任意位置(支持多个文件同时拖入,注意:文件名不要包含空格)

2.选中任意一个版本的xcarchive文件,右边会列出该xcarchive文件支持的CPU类型,选中错误对应的CPU类型。

3.对比错误给出的UUID和工具界面中给出的UUID是否一致。

4.将错误地址输入工具的文本框中,点击分析。

dSYMToos

Mac app下载地址

项目源码地址

  • Pingback: vlyubis-v-menya-esli-osmelishsya

  • Pingback: Newest indian porn videos hd-porn

  • Pingback: molodezhka4 25,26,27,28,29,30 31 molodezhka4

  • Pingback: penetration Dildo Fuck Italian Money Double Anal

  • Pingback: His Secret Obsession

  • Pingback: 201702201702

  • Pingback: last news 04 02 2017

  • Pingback: liebelib.mobi latest

  • Pingback: liebelib.mobi 40plus

  • Pingback: moana watch online

  • Pingback: refinance mortgage

  • Pingback: dnevnikivampira8sezon8serriya8

  • Pingback: meliostadaf

  • Pingback: Молодежка4сезон25серия26серия

  • Pingback: lastssadsafdsa

  • Pingback: molodejka4seria25

  • Pingback: molodezhka4sezon212223seriya

  • Pingback: molodezhka4seria

  • Pingback: lyutsife2sezon7seriya8910vse

  • Pingback: Молодежка 4 сезон 15 16 серии

  • Pingback: molodejka14serija

  • Pingback: mirdikogozapada

  • Pingback: gidrofob

  • Pingback: jpmsruvideotoppornovideo

  • Pingback: drama2016

  • Pingback: lampamafussil

  • Pingback: Binäre Optionen Tipps

  • Pingback: mobdro download

  • Pingback: lastmeamdyou

  • Pingback: white marker

  • Pingback: iOS之友盟错误统计解决 - 恰同学少年-不称

  • Pingback: 利用友盟错误统计解决Bug | 王森成长日记

  • Shuai Liu

    之前的

  • Shuai Liu

    把dsym文件拖到窗口后,再点击dsym文件,程序就会崩溃,可以这样临时解决,把DSYM文件copy到桌面,重命名,最后没有空格,汉字等特殊字符,然后就不会闪退了。记得dsym要用dSYMs文件夹下的xxx.app.dSYM,不要用xxx.app.dSYM里面的DWARF文件夹下的啊

    • answerhuang

      请问是用的最新版的1.0.3吗?

      • 郭克冰

        1.0.1和1.0.3都崩溃,为什么在另外一台机器上好好的,换了一台电脑就崩溃了呢,我也快崩溃了o(╯□╰)o

        • answerhuang

          好像跟电脑环境有关系,这个有好几个人遇到了。暂时也没找到原因。

          • 郭克冰

            好吧 不管怎么样 还是谢谢博主

  • zhengxiaozhong

    下了博主给的app,把dsym文件拖到窗口后,再点击dsym文件,程序就会崩溃,求解决办法,谢谢先

  • Pingback: dSYM 文件分析工具 | 网站采集

  • yoyoso

    RSS订阅好像有问题,用Reeder订阅不了,博主看能否修改一下啊

  • mustlogin

    非常好的工具, 但我这里用不了.
    仔细检查了文件名, 绝无空格, 不管是.dsym还是.archive, 拖进去后都是这样的结果:
    编译类型:il , UUID:unsupported,

    不知要如何解决. 我的XCODE版本是6.1, 不知与这有没有关系?

    • answerhuang

      你好,这个问题是由于 Xcode6 开始打的包里面已经不包含dsym文件了,所以自然用不了了,但是dsym文件应该是支持的啊。

      • mustlogin

        嗯。谢谢。我自己写了个MAC应用,已经可以了。你代码里面是调用其他脚本,我是直接调用外部命令,有点小不同。

      • wangyi

        我发现,把.archive 文件前面的名称改成任意数组。。就不会出来编译类型:il , UUID:unsupported了

        • answerhuang

          其实就是文件名里面不能包含空格,不然命令行里面会出问题。囧

          • derick

            命令行里用引号把路径引起来就好了吧、

          • answerhuang

            是的,这个问题已经处理好了。

  • jue

    请问编译类型:il , UUID:unsupported,是什么情况?

    • answerhuang

      sorry,应该是软件的一个 bug,选中的 archives 文件不存在导致的。可以到软件目录下面的 Resources 目录中把 dsym.db 这个文件删了。我会尽快修复这个bug。

      • jue

        不好意思,是文件名有空格的原因;
        非常感谢!

  • fhefh

    http://pan.baidu.com/s/1eQmYbAE 百度盘地址失效
    http://pan.baidu.com/s/1nt3Fv2T 这个是可以下载的

  • wangzz

    真正的解析用的是atos吗

    • answerhuang

      是的,xcrun atos命令。

  • Guest

    dwarfdump和atos有什么关系吗

    • answerhuang

      dwarfdump用来检测dsym文件和crash文件是否对应。atos是根据dsym文件以及出错的地址找到函数。

  • mingming1222

    友盟的界面应该是提供这个功能的吧?点击内存地址的那个链接执行一下就可以定位了。

    • answerhuang

      但那个只适用与在你电脑上打的包,如果在别人电脑上打包,想在自己电脑上找就比较麻烦了,而且很慢。

  • Zhang Songbai

    牛逼的大神,只能佩服,

  • lili

    answer威武,大赞!!!

  • customer

    好像需要集成个python库,和我本身的冲突可能直接crash

    • answerhuang

      您是指python版本的冲突?还是某个python库冲突。

      • customer

        我把crash日志贴到github issue了

        • answerhuang

          好的,非常感谢。

  • customer

    A Python runtime not could be located. You may need to install a framework build of Python, or edit the PyRuntimeLocations array in this application’s Info.plist file.

  • customer

    A Python runtime not could be located. You may need to install a framework build of Python, or edit the PyRuntimeLocations array in this application’s Info.plist file.