请叫我背景

最近在提交应用到App Store的时候,竟然被拒了两次。那时候心里的想法是,尼玛完蛋了,要被老板开除了,我是不是要失业了。于是乎那两周几乎毛脑子都是为什么Apple你这么狠心,我们明明相爱了那么多年,你竟然就这样抛弃了我。我不想活了,不要拦着我,我要分分钟切腹给你看。然后内心的纠结并没有什么卵用。而关于第一次被拒我这里就不说了,正对第二次被拒稍微进行拓展。

崩溃被拒

第二次被拒这是因为一个崩溃而被拒的。在我刚看到崩溃的时候就想着,小case,崩溃的bug还是比较好解决的,至少好定位,相对第一次那种没有说明具体原因被拒好查多了。关键是Apple的审核人员还提供了crash的文件给我。在我洋洋得意的下载并且打开苹果方面放给我的崩溃日志的时候,尼玛我又蒙逼了,里面完全没有我熟悉的代码以及行数的显示什么的,跟我所熟知的类型(见下图)完全不一样啊,熟悉的配方,熟悉的味道明明在后面是有大概的错误方法调用的堆栈信息的说。

特么苹果给我的是一对内存地址的样式(见下图)啊!!!!!!!特么只有一对地址的位置信息,特么你告诉我这怎么看,这怎么看,你过来看我打不打死你!

然后我特么自己想重新苹果审核人员重现的Bug特么一直就是重现不了,没办法最后只能去找找看下有没有办法反编译这种加密的崩溃日志。然后我在研究官方文档的时候我看到了一句话叫做:

Symbolication – resolving backtrace addresses to source code methods and lines – requires the application binary that was uploaded to the App Store and the .dSYM file that was generated when that binary was built. This must be an exact match – otherwise, you might get a partially symbolicated crash report.

里面有提到通过上传的二级制文件以及.dSYM文件可以标识化这种只含有追溯地址的崩溃日志,即将我看不懂的这种加密的崩溃日志,转换成我稍微熟悉一点的堆栈信息的崩溃日志。废话不多说,直接说如何做吧。

解密地址堆栈

解密这种地址的崩溃日志只需几步就能搞定了。只要准备好对应的.app的二进制文件以及产生二进制文件的dSYM文件。将”加密”的崩溃日志与这两个文件放置在同一个目录,准备工作就做好了。

  • 第一步,找到DTDeviceKitBase.framework文件所在,不同版本的Xcode这个文件所放的目录都不大一样。下面提供两个参考的路径:

Xcode 6以前:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework

Xcode 6以后(包括):/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework

  • 第二步,建立命令别名,以Xcode 7为例,运行如下命令:

alias symbolicate="/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash -v"

  • 第三步,更新DEVELOPER_DIR的环境变量,因为如果不跟新的话,在反编译的过程中会出现报错的情况

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"

  • 第四步,标识化”加密”的崩溃日志,让其变为非地址堆栈的崩溃日志。首先先用cd命令切换到到你准备的.app二进制文件以及dSYM文件所在目录,然后运行如下命令

symbolicate -o "反编译后文件名" "需要反编译的文件" "项目名.app"

其中反编译后的文件后缀可以用.crash、.txt等文件名,不过我个人喜欢用.crash后缀名,因为可以用系统自带的控制台(Console)来查看,项目名则为你建立项目的时候取的名字。这样你反编译后的文件就产生了,至少崩溃日志是可以看懂了(见文章的第一张图)。

如何查看崩溃日志

好了,获得是人类可读语言的崩溃日志后,或者是从别人手机到处崩溃日志后,下一步就是查看了。下面就正对一个程序猿该如何看稍微说说。

崩溃日志头

Incident Identifier: 635A20F0-BC79-4724-AE45-D49097085250

CrashReporter Key:   21a348fcc69b56e9f74e9b0078c8d7bbc0ace04a

Hardware Model:      xxx

Process:             crashDemo [3131]

Path:                /private/var/mobile/Containers/Bundle/Application/B2B0DDAE-2E1B-422E-AA4D-99C2578C99E6/crashDemo.app/crashDemo

Identifier:          com.demo.crashDemo

Version:             2443 (1.4.2)

Code Type:           ARM-64 (Native)

Parent Process:      launchd [1]

Date/Time:           2015-11-24 17:57:00.00 -0800

Launch Time:         2015-11-24 17:56:44.44 -0800

OS Version:          iOS 9.1 (13B143)

Report Version:      105

Exception Type:  EXC_CRASH (SIGABRT)

Exception Codes: 0x0000000000000000, 0x0000000000000000

Exception Note:  EXC_CORPSE_NOTIFY

Triggered by Thread:  0

首先正对这个崩溃日志头,程序猿级别的童鞋只要关注几点就好了。 Process:是在Info.plist文件中key为CFBundleExecutable所填写的名字,首先先确认这个,别到时候发现尼玛这不是自己的崩溃日志 Version:这个则是要关注的第二个点,就是这个崩溃日志产生的版本,因为对于中大型公司来说的话,一般有可能多个版本并行的情况,针对崩溃日志一定要看清楚是哪个版本,这个是由Info.plist文件中的CFBundleVersion和CFBundleVersionString组成 OS Version:这个字段则是说我这个崩溃日志是在什么系统上面产生的,iOS 8还是iOS 9?这个总得知道吧,因为有可能你用到了被停用的接口啊,或者是太新的接口在老版本上不兼容啊等问题 ‘Exception Type’:说明崩溃产生的原因,具体的详情可以查看苹果官网

‘Triggered by Thread’:这个说明在哪个线程上崩溃的,这个一定得看要不然下面一堆堆栈信息完全就不知道看哪个了

崩溃日志的堆栈信息

然后就是找到对应的崩溃堆栈信息来说的话,去找对应的崩溃函数,还是用上方的第一张图来举例:

其实如果是自己写的代码一眼就能看出来问题所在了,因为能从这个堆栈中找到问题所在。一般这个调用都是从上往下看,最上面的出现你熟悉的代码一般就是问题所在了,如果上图中[JsonUtil dataRequest:Key:Delegate:Info:] (JsonUtil.m:166)一眼就能看出来这个是我的代码,然后我去分析这行代码周围的代码很快就能找到问题所在了。至于其他的就没什么好看了。

结束语

其实除了从苹果审核人员那里获得崩溃日志外,我们还可能通过从测试人员的手机里拷贝出来。一般通过iTunes的同步功能就能讲手机中的崩溃日志拷贝到电脑里面来查看(如下图)。如果是Mac的话目录应该是在/Users/chipsea/Library/Logs/CrashReporter/MobileDevice目录下能看到同步的到的崩溃日志,然后根据日志进行修改Bug吧。最后去屎吧八阿哥!

遭遇Crash文件战:教你如何搞定iOS崩溃日志相关推荐

  1. ipa解包打包工具_7步!教你轻松搞定ios重签ipa包

    如果你想在自己的IPhone上安装一个ipa文件,你的手机是无法正常安装的,(越狱,企业证书分发除外)但是我们可以通过以下步骤来实现,前提要有自己的开发者账号.接下来就看一下具体的步骤: 第一步:用X ...

  2. 计算机故障维修要遵循什么原则,超级实用的六条法则教你快速搞定电脑故障维修!...

    超级实用的六条法则教你快速搞定电脑故障维修! 发布时间:2015-06-03 14:31:39   作者:佚名   我要评论 今天小编给大家推荐的电脑故障维修通用法则,是很实用的哦,大家可以收藏起来好 ...

  3. 如何解决html文档无法复制,职场必备技能:网页文档无法复制,3招教你轻松搞定...

    原标题:职场必备技能:网页文档无法复制,3招教你轻松搞定 其实很多人在浏览网页时都会遇到这个问题,看到了自己喜欢的文章片段,某一段文字特别符合自己的工作汇报,想要复制下来,结果却发现弹出了窗口,不是让 ...

  4. 服务器微信服务号响应变慢,微信卡顿和响应慢,教大家轻松搞定:简单操作,赶快收藏分享吧...

    原标题:微信卡顿和响应慢,教大家轻松搞定:简单操作,赶快收藏分享吧 作者:快分享(ID:280062218)致力于互联网价值资讯交流分享,妙招.美食.攻略大放送,欢迎来撩!点击上面的"关注& ...

  5. qlaber 中放置图片_我准备了60个案例,教你彻底搞定PPT图片排版!

    大家好,我是秋小叶!这里是秋叶 PPT 的「Office 干货」栏目. 有图片的 PPT 页面该如何排版?这大概是很多小伙伴都头疼的一大难题~今天给你分享一篇三顿的文章,用 60 个案例教你彻底搞定 ...

  6. python文献检索_那个发了好几篇SCI的师姐,教你如何搞定文献检索和科研图片!...

    原标题:那个发了好几篇SCI的师姐,教你如何搞定文献检索和科研图片! 1 写论文是一门秃头的艺术 近年来,越来越多的科研机构,将 SCI 论文作为评价医生及科研人员学术水平的一个重要指标. 可以这么说 ...

  7. ppt中如何合并流程图_简单4招,教你轻松搞定PPT中的流程图!

    原标题:简单4招,教你轻松搞定PPT中的流程图! 来自:PK阿锴(ID:akaippt) 作者:王培锴 今天跟大家分享PPT流程图的制作方法,流程图相信大家都经常遇到,通常分布着许多节点,由线条链接起 ...

  8. 如何在原先的jqgrid中填充新的数据_自然人电子税务局(扣缴端)数据如何恢复?申税小微教您轻松搞定...

    自然人电子税务局 数据如何恢复? 申税小微教您轻松搞定! 财务小王:申税小微,我们公司换了新电脑,重新安装的自然人电子税务局(扣缴端)上没有人员采集信息和历史申报数据该怎么办? 申税小微: 1.可以在 ...

  9. 手把手教你快速搞定4个职场写作场景

    " [写作能力提升]系列文章: 为什么建议你一定要学会写作? 手把手教你快速搞定 4 个职场写作场景 5 种搭建⽂章架构的⽅法"免费赠送! " 一.前言 Hello,我是 ...

最新文章

  1. python【蓝桥杯vip练习题库】ADV-350珠心算测验
  2. 技术管理:带人和团队管理
  3. 安全容器的发展与思考
  4. Highcharts 环境配置介绍
  5. shell 非_Shell基本操作(一)
  6. 常见的目标检测中的背景建模方法总结
  7. 关于OPENGL与OPENGL ES的区别
  8. 3.6.1最大熵阈值分割寻找阈值实现图像二值化
  9. Matlab中的函数句柄@
  10. 消息提示的架构演进-理论篇
  11. 2台主机极致实现双主复制架构及MMM
  12. centOS7安装node+mongoDB+redis+express(forerver)+nginx+https
  13. MTF直播整合导航网站源码
  14. 高通android刷机工具,步步高工具高通版刷机救砖教程图解
  15. EasyGame网络游戏服务器解决方案
  16. 如何对网络“黑灰产”实现精准打击?
  17. 【LaTex】6.4 listings高亮设置
  18. 非参数与半参数统计之核函数
  19. 13 | 关于写简历,必须要注意的一些细节
  20. 中国民营医院行业市场运营模式与发展动向展望报告2022~2027年

热门文章

  1. html 绑定事件的方式
  2. 自动驾驶方案及相关对标
  3. html盒子毛玻璃效果,css毛玻璃效果(外加background属性)
  4. 计算机应用基础实训项目任务说明,计算机应用基础实训项目二综合应用.docx
  5. vue,返回上一页面
  6. linux桌面版排行2019_2019年Linux系统TOP100排行 国产Deepin排名第十
  7. 22级浙江大学MBA笔试备考的若干经验分享
  8. 成人素质教育,正在“悄悄变强大”丨蓝鲸观察
  9. 鸿蒙电视应用太少,鸿蒙系统不及预期效果?荣耀电视开售一月,被用户差评吐槽应用少...
  10. python数据分析水果_超酷炫的事情,使用python识别出图片里的水果