热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS崩溃解析&原理介绍

1.为什么崩溃日志需要解析如图所示是崩溃日志线程回溯信息,其中的调用堆栈都是二进制地址,而不是可读的函数名称因此需要对崩溃日志进行解析,解析成可以理解的函数调用堆栈。

1. 为什么崩溃日志需要解析

如图所示是崩溃日志线程回溯信息,其中的调用堆栈都是二进制地址,而不是可读的函数名称因此需要对崩溃日志进行解析,解析成可以理解的函数调用堆栈。

iOS崩溃解析&原理介绍
image

2.生成dSYM符号文件

crashlog 解析需要调试符号表文件 dSYM(debugging symbols)dSYM 文件实际上是从Mach-O 文件抽取调试信息得到的文件目录。在编译工程时, debug 模式会默认选中生成dSYM文件, 该配置可在 Build Setting|Build Option 中更改。 dSYM文件生成比较耗时,如果不需要进行 crashlog 解析,可以选择不生成。

iOS崩溃解析&原理介绍
image

2.1 Debug下可以在DeriveData的目录下获取到dSYM文件

iOS崩溃解析&原理介绍
image

2.2 打包的时候可以在生成的.achive目录下找到对应的dSYM文件

iOS崩溃解析&原理介绍
image

2 解析方法

2.1 Xcode 解析

crashlogdSYM 文件和可执行文件放在同一目录下,然后将 crashlog 拖拽至 Devicelog中,右键 Re-symbolicate Log 就能解析。

iOS崩溃解析&原理介绍
image

iOS崩溃解析&原理介绍
image

2.2 使用 symbolicatecrash 命令行解析

  • 1.首先找到symbolicatecrash的路径
    iOS崩溃解析&原理介绍
    image

    通常symbolicatecrash的路径为/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

  • 2.命令行解析
    首先将崩溃日志,dSYM以及symbolicatecrash复制出来放到同一个文件夹,然后cd到当前文件夹
    ,运行如下命令解析./symbolicatecrash temp.crash testxcConfig.app.dSYM > result.log

    iOS崩溃解析&原理介绍
    image
  • 3.首次运行需要先运行命令export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"

3.解析原理

dSYM 文件介绍

iOS崩溃解析&原理介绍
image

其中真正保存保存数据的是 DWARF 文件, DWARF(Debuging With Arbitrary Format)是ELF 和 Mach-O 等文件格式中用来存储和处理调试信息的标准格式。 DWARF 中的数据是高度 压 缩 的 , 可以通过dwarfdump命令提取可读信息,比如提取关键的调试信息.debug_info、.debug_line。
注释: ELFMach-O用于存储二进制文件、可执行文件、目标代码和共享库的格式文件。

iOS崩溃解析&原理介绍
image

解析流程

  1. 计算崩溃地址对应符号表中的地址
    以某 crashlog 文件为例,如下图所示。是一个Exception类型的异常,从下至上依次为该线程的调用堆栈,右边红色框第一列为运行时的堆栈地址,第二列为进程运行时的起始地址(testxcConfig 所有行起始地址都相同),第三列为运行时的偏移地址。

    iOS崩溃解析&原理介绍
    image

    运行时堆栈地址=运行时起始地址+偏移地址,以第 4 行为例。0x1022cd990=0x1022c8000 + 0x5990(22928),以上地址均为 app 发生崩溃时的运行地址,根据虚拟内存偏移地址不变的原理,只要知道符号表 TEXT 段的起始地址,加上偏移量(0x5990)就能得到崩溃地址对应符号表中的地址, 符号表 TEXT 段的起始地址可通过以下命令获得。

    iOS崩溃解析&原理介绍
    image

    那么崩溃地址(0x1022cd990)对应符号表中的地址为:0x100005990 =0x0000000100000000+0x5990

  2. 地址重映射
    获取符号表地址后,在 debug-info 章节中查找包含该地址的 DIE(Debug Information Entry)单元就能获知该符号地址对应的函数名称(name)、 函数所在的文件路径(decl file)和函数所在行数(decl line),如下图所示。

    iOS崩溃解析&原理介绍
    image

    上述步骤解析出了函数相关信息, 下面进一步获取该地址对应的准确行数, 这需要借助debug_line章节, debug_line 章节以文件为单位,准确记录了文件中的每一行对应的符号表地址, 0x100005990 对应 AppDelegate.m 的第 20 行。

    iOS崩溃解析&原理介绍
    image
  3. 手动解析 crashlog
    当有完整的 crashlog 文件和对应的 dSYM 文件时,以上过程可以由 Xcode 自动完成。但对于用户反馈的 crash, 需要用户手动复制本地的crashlog 文件,而通常crashlog 文本较长,完整复制其实比较麻烦,那么此时可以只复制崩溃线程的 crash 信息,并通过手动解析。手动解析 crash 可以使用 dwarfdump、 atos 工具, 命令如下。
  • 方法一

    iOS崩溃解析&原理介绍
    image
  • 方法二

    iOS崩溃解析&原理介绍
    image
  • 方法三
    iOS崩溃解析&原理介绍
    image

    方法二、三都使用了atos解析,区别是方法三不需要获取符号表地址, 其后倒数第一个地址为运行时堆栈地址,倒数第二个地址为进程起始地址。
    手动解析另一个应用场景是,若开发人员为了跟进某一偶现问题在日志中记录的是运行时的二进制地址,那么可以通过对应的 dSYM 文件手动解析出调用函数明文。

4.常见问题

  1. 如何找到crashlog 对应的 dSYM 文件?
    打开终端,使用以下命令获取 dSYM 文件对应的 uuid, 并与crashlog文件Binary Image后面的字符对比,如果字符完全相同,就说明 dSYM文件与crashlog对应。

    iOS崩溃解析&原理介绍
    image

    iOS崩溃解析&原理介绍
    image

    另外可以使用mdfind命令去寻找指定uuid的dSYM文件,如下,uuid需大写并转化成格式,如下图
    mdfind "com_apple_xcode_dsym_uuids == D5644244-F2C4-3C96-BD63-EF0F4DA518FA"

    iOS崩溃解析&原理介绍
    image
  2. 如何手动生成 dSYM 文件?
    如果在编译之前忘记在 buildsetting 中选中生成 dSYM文件,然而 app 又发生了崩溃,那么可以通过 app 的可执行文件再手动生成 dSYM 文件。
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/dsymutil /Users/ranjingfu/Desktop/testxcConfig/testxcConfig.app/testxcConfig -o out.dSYM

    iOS崩溃解析&原理介绍
    image

    值得注意的是,只有可执行文件为 debug 模式产物时,才能使用上述方式手动抽取调试符号表文件(dSYM)release模式无法抽取。 因为debug产物会保存调试信息,而release产物不会, dSYM文件就是从调试信息中抽取出来的。

解析后的崩溃日志实例

iOS崩溃解析&原理介绍
image

推荐阅读
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
  • ios中级面试题(二)
    1.如何追踪app崩溃率,如何解决线上闪退当iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上。crash日志上有很多有用的信息,比如每个正在执行线程的 ... [详细]
  • iOS专项总结关于analyzeClang静态分析器SlenderFauxPasWarningLeaksTimeProfiler加载时间iOSApp启动过程帧率等如何优雅地显示帧率标签?iO ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • php和jq开发怎么使用es6,PHP与jquery
    本文目录一览:1、phpstorm怎么使用es6语法 ... [详细]
  • 认识Cutestrap,一个轻量级CSS框架
    CutestrapisabrandnewCSSframework.ThisarticlepresentsCutestrap’sfeaturesandputstheframework ... [详细]
  • mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)
    前言InnoDB有两块非常重要的日志,一个是undolog,另外一个是redolog,前者用来保证事务的原子性以及InnoDB的MVCC& ... [详细]
  • ext2ext3ext4文件系统的区别:ext2为非日志文件系统,即在文件系统的运行期间不会记录写操作的日志,这就 ... [详细]
  • 采用CreateThread()创建多线程程序
    本位转自:http:blog.csdn.netcbnotesarticledetails8277180在window环境下,Win32提供了一系列的AP ... [详细]
  • 转载自http:blog.csdn.netzhifeiyu2008articledetails8829637打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF ... [详细]
  • 这是一篇CocoaChina的一个网友整理的Xcode快捷键大全,实在是太多了,我看得眼花缭乱的,不过还是非常实用,想学习就往下看吧!可能有些新手刚用mac,不知与windows键 ... [详细]
  • Apple Watch应用开发
    参考转载:http:www.swiftkiller.com?p613A.概览一.概览--开始为AppleWatch进行开发-1.第三方应用需要两个不同的可执行文件:在AppleWa ... [详细]
author-avatar
qk墨砚轩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有