前言

在负责的产品中有最近一段时间有极个别用户老是反馈有偶尔闪退的情况,而且就这几个用户反复出现,其它用户,甚至就坐在他边上的用户进行了一样的操作都没有任何问题。

刚开始丢了个重现构建的新包给这几位用户将就的用着,但直到今天 PM 受不了了,让我无论如何都要想办法解决这个问题,但我也一脸懵逼啊,按照用户的操作路径来看我也没能复现,甚至分析平台都抓不到对应信息,更何况这还是个企业级应用,没上到 AppStore,也就没法从 iTunes Connect 中拿到崩溃日志。

所以开始酝酿了一个事情......

分析问题

为了快速定位到问题所在,PM 和 leader 再三的跟用户进行交流,大家都没有一个比较好的方案,最后我厚着脸皮让用户照着下面这张图从设备中导出了一份崩溃日志发送给我:

从真机中拿到这份 ips 文件后就好办了很多,如果此时直接打开这个文件,可以看到如下图所示内容:

能够拿到真机的情况下, 在不删掉 app 的情况下直接调试; 无法复现问题,则把真机插入电脑,打开 Xcode -> Window -> Devices and Simulators -> View Device Logs,直接找到需要的 log;

在拿不到真机的情况下,先来直接讲解一个能够解决问题的流程:

第一步:ips 文件

“死皮赖脸”的让用户通过图 1 所示方法导出一份最新的 .ips 文件,并让用户分享给自己,并把文件名修改为 .crash 后缀,使其标识为 crash 类型;

第二步:.dSYM 文件

.dSYM 文件(debugging SYMBols,调试符号表)。从打包机(如果是通过打包机隔离构建的话)或本机上导出一份与用户设备中安装的 app 版本一致的 .dSYM 文件,该文件中详细的记录了 16 进制下的函数地址的映射信息。

需要注意的是,Xcode 的默认设置是会在 release 和 debug 环境下已经配置好了 archive 时自动带出 .dSYM 文件,如果你发现打开包内容时并没有发现 .dSYM 文件,可以到 Xcode 的 Build Settings 中查看 Debug Infomation Format 字段的配置进行修改。

.dSYM 文件对于后续排查问题十分重要,每一次 release 版本都最好要保存对应的 dSYM 文件或把整个 Archives 文件进行保存;

第三步:symbolicatecrash 工具

symbolicatecrash 工具。该工具跟随 Xcode,是获取符号化结果的最方便工具。symbolicatecrash 的地址视 Xcode 的安装路径而定,大致的地址为:

你的Xcode安装路径/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

第四步:获取崩溃代码信息

有了 .ips 文件、.dSYM 文件和 symbolicatecrash 工具后就可以直接进行解析日志了~因为我把这三个文件都统一放在了一个文件夹中,所以实际上命令看起来会是这样:

./symbolicatecrash ./yourApp.crash ./yourApp.dSYM > crash.log

如果在输入这条命令时告知找不到 DEVELOPER_DIR,可以导出一份:

export DEVELOPER_DIR="你的Xcode安装位置/Xcode.app/Contents/Developer"

对输出的结果重定向到了当前路径下的 crash.log 中,此时打开该文件,看到的内容是这样的:

很崩溃啊!重要的细节一个都没有展示出来!随后我换了一个思路,我们重新回到第三步

回到第三步:atos 命令

关于 atos 命令的描述,可以使用 man atos 查看具体信息:

...
DESCRIPTIONThe atos command converts numeric addresses to their symbolic equiva-lents.  If full debug symbol information is available, for example in a.app.dSYM sitting beside a .app, then the output of atos will includefile name and source line number information.
...

这是一个专用于 macOS 的控制台工具,从描述中可以看出,可以将地址转换为实际二进制图像的符号化字符串(实际代码)。上文中说到的 symbolicatecrash 工具是 apple 基于 atos 方便开发者进行的优化封装,但不知为何我的 symbolicatecrash 并不能完整的符号化所有 crash log 中的内容。所以现在将直接使用 atos 进行符号化,操作稍微繁琐一些,我们可以把对应的命令修改为:

atos -o yourApp.dSYM/Contents/Resources/DWARF/yourApp -arch arm64 -l 0x104e40000 0x0000000104f90198

0x104e400000x0000000104f90198 这两个地址是什么意思呢?我们再看这张图:

0x104e40000local address0x0000000104f90198address,这两个地址在不借助其它工具的前提下可以直接手算出来,如果你对手算地址感兴趣的话,可以看这篇文章。

通过执行上述 atos 命令,可以看到输出了正确的信息,如下图所示:

接下来就可以把多个地址进行解析,配合着在堆栈中的这几个关键信息基本上就可以定位到具体的 crash 代码文件和行数。

其它工具

关于符号化奔溃报告,还有以下几种: dwarfdump。这个工具用来应付普通的 crash 日志符号化完全是小题大做,但不排除某些极端下的情况。这个我没使用过,不做展开。 lldblldb 在日常使用 Xcode 进行开发的过程中已经非常熟悉了,是 Xcode 的默认调试器。这部分我也没试过,大家可以自行搜索进行尝试。

总结

总不能每次出问题都要经过上述这么费劲的流程吧?当然可以说把这些流程写成一个脚本,每次只需要输入 local addressaddress 即可,但实际上这样的效果并不令人感到舒服。所以,为了节省后续更多的时间,接下来将准备写一个 Mac App,每次进行符号化时,只需要根据提示提前配置好对应的文件,再写下对应的 local addressaddress 就可以完成。

本系列下篇文章中将继续讲解......

两个输出文件名解析为同一输出路径_解析 crash log(一)相关推荐

  1. java解析c的结构体_解析C语言中结构体struct的对齐问题

    首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度.如在32位机器中,char对齐值为1,short为2,int,float为4,do ...

  2. Linux Shell find命令只输出文件名字,不携带路径

    如果只用find命令,不借助'grep'或'awk'命令,find命令是否可以实现仅输出文件名字呢? 有人说用'ls -1'就可以,确实,在普通的应用场合,用'ls'这个命令足以.但是,find携带了 ...

  3. 全网首发:VS编译出错:两个输出文件名解析为同一个输出路径

    具体错误: 1>------ 已启动全部重新生成: 项目: TsOfficeInstaller-final, 配置: Debug Any CPU ------ 1>C:\Windows\M ...

  4. jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国

    我们将使用 Linux 上的命令行工具解析并格式化打印 JSON.它对于在 shell 脚本中处理大型 JSON 数据或在 shell 脚本中处理 JSON 数据非常有用.-- Ostechnix J ...

  5. Python 解析HJ212-2017并输出Modbus-TCP

    功能: 利用python开启服务端口,接受来着环保数采仪上传的HJ212-2017报文数据,解析后并输出Modbus-TCP给上位机或PLC读取,可同时连10个主站. 应用场景: 污水厂进出水在线监测 ...

  6. linux服务器返回json,Linux 命令行工具解析和格式化输出 JSON的方法

    JSON 是一种轻量级且与语言无关的数据存储格式,易于与大多数编程语言集成,也易于人类理解 -- 当然,如果格式正确的话.JSON 这个词代表 J ava S cript O bject N otat ...

  7. 编写程序:构造如下文档内容 姓名:邀请您来参加本次会议 李雷 其中,姓名从文件 names.txt 中读取,共 3 个,产生的输出文件为 3 个,输出文件名为对应的 姓名,txt如 张三.txt

    3. 编写程序:构造如下文档内容姓名:邀请您来参加本次会议李雷其中,姓名从文件 names.txt 中读取,共 3 个,产生的输出文件为 3 个,输出文件名为对应的 姓名,txt, 如 张三.txt. ...

  8. R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立、输出期望的列联表

    R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立.输出期望的列联表 目录

  9. xdebug模块输出文件名的配置说明

    xdebug的性能测试输出文件名是可以配置的. 默认是 xdebug.profiler_output_name = cachegrind.out.%p 那个%p是服务器的pid,会输出"ca ...

最新文章

  1. python运行完不能显示图_【已解决】Python中通过Image的open之后,去show结果打不开bmp图片,无法正常显示图片...
  2. RocketMQ CommitLog And Index
  3. 汇编语言--8086CPU
  4. Leetcode 103.二叉树的锯齿形层序遍历
  5. (转载)Android进阶2之Activity之间数据交流(onActivityResult的用法)
  6. 莫烦python博客_《莫烦Python》笔记 -- numpy部分
  7. Python程序设计语言基础02:Python基本图形绘制
  8. c语言文件替换字符串,C语言替换字符串
  9. 关于 TCP window size
  10. C++ OpenCV技术实战之身份证离线识别
  11. matlab h系统控制器,Matlab的H_inf鲁棒控制器的设计.pdf
  12. python 会议室预约系统解决方案_会议室预约管理系统方案书.pdf
  13. SQL Server 2014如何导出数据库
  14. 来自一个曾经200斤现在140斤程序员的减肥成功经验(包含个人认为相对安全的饮食法推荐)
  15. 前端性能优化的关键时间点
  16. 口算系统c语言,一二年级口算题出题系统
  17. 健身记录--每日更新
  18. ViewData、ViewBag和 TempData
  19. 聚苯乙烯负载酸性离子液体(P[Vim-PS][HSO4])|活性炭(AC)负载酸性离子液体[Hmim-BS][HSO4]齐岳
  20. 数值分析 第七章 常微分方程的数值解法

热门文章

  1. 绝密邮件曝光!看乔布斯如何拯救濒危的苹果?
  2. 4 种最令人讨厌的编程语言:Java、C++ 上榜
  3. 华为定义5.5G网络;阿里巴巴美股投资者发起集体诉讼;Kaldi核心算法K2 0.1版本发布|极客头条
  4. 国产 Java 代码补全神器,aiXcoder 2.0 实测
  5. 程序员如何用代码彻底终结系统那些事儿?
  6. 程序员不会SQL有多难?高级工程师:可能工作都找不到!
  7. 疫情防控,开发者集结出战!
  8. 2019 年被“杀”死的那些技术!
  9. 为什么 SQL 程序员也要懂 Python?
  10. 200 万年薪的博士,华为到底看重什么?