做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友一点帮助。

什么是dSYM文件

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

dSYM文件有什么作用

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

通过Mac自带的命令行工具解析Crash文件需要具备三个文件

1.symbolicatecrash,Xcode自带的崩溃分析工具,使用这个工具可以更精确的定位崩溃所在的位置,将0x开头的地址替换为响应的代码和具体行数。

2.我们打包时产生的dSYM文件。

3.崩溃时产生的Crash文件,例如:*.crash。

下面开始解析

第一步,在桌面新建一个文件夹,一般命名为Crash,然后将.Crash , ,.app.dSYM, symbolicatecrash三个放到这个文件夹里,首先找到.app.dSYM文件,打开xcode,window->Organizer打开之后,找到上传时候对应的版本然后show in Finder

 

到了这个界面之后显示这个包的内容

 

到了这个页面就可以看到.app.dSYM了

 

第二步,找到symbolicatecrash

首先给xcode打一个补丁:命令行运行

/usr/bin/xcode-select -print-path

如果输出"/Developer"或者其他非"/Applications/Xcode.app/Contents/Developer/"的内容,运行下面的命令:

sudo /usr/bin/xcode-select -switch/Applications/Xcode.app/Contents/Developer/

2.查找symbolicatecrash:

find /Applications/Xcode.app -name symbolicatecrash -type f

获取路径,这个命令可能执行的时间长一点,耐心等待一下,找到这个路径后复制下来,前往这个路径就可以找到symbolicatecrash,把它复制下来放到开始建的那个文件夹里,Xcode7.3我当时的路径是/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

第三步,把三个文件都放到那个文件夹里,然后在终端执行命令

1.首先切换到这个文件夹

cd /Users/app/Desktop/crash

2.解析这个Crash文件,*,xx指相应的文件名字,多个Crash文件,重复使用这个命令就行,不过一定要把导出的文件名symbol.text改一下,以免覆盖原来的

./symbolicatecrash ./*.crash ./xx.app.dSYM> symbol.text

3.如果上边的命令不成功,使用命令检查一下环境变量,返回结果是:/Applications/Xcode.app/Contents/Developer/

xcode-select -print-path

4.如果返回的不是上面的结果,需要使用下面的命令设置一下导出的环境变量,然后重新解析就行了

export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer

解析完成后,会在Crash文件夹生成一个symbol.text

打开后图中红色部分就是崩溃的地方

 

命令行解析Crash文件的更多相关文章

  1. 使用命令行解析php文件

    使用命令行解析php文件,这样可以调用Log4PHP库中的一些demo,因为默认的输出使用命令行作为输出. 建一个bat文件: echo 以下是使用命令行解析php文件 C:\xampp\php\ph ...

  2. 命令行工具解析Crash文件,dSYM文件进行符号化

    备份   文/爱掏蜂窝的熊(简书作者)原文链接:http://www.jianshu.com/p/0b6f5148dab8著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 序 在日常开发 ...

  3. iOS- 全方位解析.crash文件崩溃报告

    1.前言 想来每个iOS攻城狮,都免不了要接触.crash文件 那么什么是.crash文件? iOS app的所有崩溃记录都会记录在设备上,所以对于和我一样没有集成让用户发送崩溃报告功能的iOS开发者 ...

  4. Xcode自带工具symbolicatecrash解析Crash文件

    项目中遇到一台手机运行测试包闪退的现象,而且是一个设备闪退其他设备没有再现的情况 可以看到Crash信息,但是指定的问题给出的是16进制内存地址,根本无法定位问题发生在哪个类的哪个函数中 所以需要解析 ...

  5. 在windows下使用cmd命令行对java文件进行编译和执行

    windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进行编译和执行,前提是jdk已成功安装并正确配置相关环境变量 相关配置链接:java基础学习总结—— ...

  6. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  7. python实现命令行解析的argparse的使用

    参考https://docs.python.org/3.6/library/argparse.html argparse模块使编写用户友好的命令行界面变得很容易.程序定义了它需要什么参数,argpar ...

  8. 『Argparse』命令行解析

    一.基本用法 Python标准库推荐使用的命令行解析模块argparse 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的optparse.因为argparse是 ...

  9. python命令行解析模块--argparse

    python命令行解析模块--argparse 目录 简介 详解ArgumentParser方法 详解add_argument方法 参考文档: https://www.jianshu.com/p/aa ...

随机推荐

  1. <![CDATA[ ]]> 的作用

    在xml文件中 一些特殊字符需要去除其本意,就要用到 <![CDATA[    ]]>,,比如 ibitis的sqlmap.xml 中  要比较大小不能直接用 < 或者 > , ...

  2. js常用

    window.navigator.userAgent.toLowerCase().indexOf("msie") != -1 是否是IE浏览器

  3. java_method_下载导入模版

    //调用方法 upDown.download(request, response, request.getRealPath("")+"/output/BlackNumbe ...

  4. java中trim()函数是什么

    trim() 去除字符串前缀和后缀空格 文件名:Test.java ,编译通过 public class Test {     public static void main(String args[ ...

  5. flash中设置文本字体样式

    txt.setTextFormat(tf);  txt.defaultTextFormat = tf;

  6. jQuery Mobile 工具栏

    jQuery Mobile 工具栏 工具栏元素常被放置于页眉和页脚中 - 以实现"已访问"的导航: 标题栏 页眉通常会包含页眉标题/LOGO 或一到两个按钮(通常是首页.选项或搜索 ...

  7. delphi7 在虚拟机 vbox里面安装失败

    提示Error 1324.The path My Pictures contains an invalid character. 解决办法:新建一个文件夹,123, 设置 我的文档文件夹 目录指向 “ ...

  8. python 正则re模块

    re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词. import re text = "JGood is a handsome boy, he ...

  9. SQL Server已提交读快照隔离级别的设置

    如果要把SQL Server数据库事务隔离级别设置为已提交读快照隔离 如果直接运行下面的语句: ALTER Database [mydbname] SET READ_COMMITTED_SNAPSHO ...

  10. vs2015 command prompt here

    网上搜的很多方法都不能用,比如:http://app.paraesthesia.com/CommandPromptHere/ 主要是都搞错了注册表路径,写成了: HKCR,Directory\Shel ...