7

iOS Crash文件获取及符号化

 3 years ago
source link: https://gsl201600.github.io/2020/04/29/iOSCrash%E6%96%87%E4%BB%B6%E8%8E%B7%E5%8F%96%E5%8F%8A%E7%AC%A6%E5%8F%B7%E5%8C%96/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
2020-04-29 • 于 代码库 阅读 528

iOS Crash文件获取及符号化

  1. Crash文件获取
  • 大致可以分为两种方式:远程获取和本地获取;具体可以分为如下四种途径

1.1. 远程获取;已经上传到iTunes Connect的应用,可以通过iTunes ConnectApp分析查看App崩溃情况不会有崩溃日志,如果是TestFlight测试,则可以在iTunes Connect获取到崩溃日志

1.2. 远程获取;通过Xcode菜单Window -> Organizer -> Crashes获取用户的崩溃日志

2020.04.29.01.png
  • 注意:以上两种途径都需要登录开发者账号,并且需要用户共享iPhone分析,才能够获取到用户的崩溃日志
  • 注意:官方提供的崩溃信息并不是实时的,只能查看两天之前的崩溃信息,需要实时的可以使用第三方工具

1.3. 本地获取;在手机上设置 -> 隐私 -> 分析与改进 -> 分析数据中,根据应用名称和日期时间找到你需要的日志,点击进去后,右上角会有个分享按钮,分享给Mac

1.4. 把手机连接到Mac,通过Xcode菜单Window -> Devices and Simulators -> Devices -> View Device Logs获取用户的崩溃日志

  • 注意某些iOS系统会没有上面提到的分享按钮,这时候可以全选复制,再发送给Mac
    1.1该图为早期iTunes Connect官网,具体以当前官网为主
  1. Crash文件符号化
  • 大致也是分为两种方式:使用Xcode自动符号化和通过手动命令行工具symbolicatecrash符号化;这两种方式原理一样,都需要dSYM文件,只不过前者是Xcode自动帮我们完成的
  • 注意:如果你们的应用是通过Xcode上传iTunes Connect的,并同时上传了.xcarchive文件(实际上是一个文件夹,包含.ipa和.dSYM文件)Xcode会默认帮你勾选该选项,那么从iTunes Connect获取到的日志就已经是符号化过的了

2.1. 使用Xcode自动符号化Crash文件,Xcode自带的工具非常好用

  • 如果你用的Mac就是打包的机子,并且得到了发生崩溃的手机,那么手机连接电脑,通过Xcode菜单Window -> Devices and Simulators -> Devices -> View Device Logs找到自己的日志,就是符号化过后的,如果没有符号化,就稍微等待一会儿,或者右击点出菜单选择Re-Symbolicate Log
  • 如果只有Mac出包机,没有手机只有崩溃日志,那么同样可以通过Xcode菜单Window -> Devices and Simulators -> Devices -> View Device Logs把崩溃日志直接拖进去,就是符号化过后的,如果没有符号化,就稍微等待一会儿,或者右击点出菜单选择Re-Symbolicate Log
  • 注意:在有些版本的Xcode是拖不进去的,遇到这种情况可以用下面的手动符号化方式
  • 注意:上面的方法不一定要是出包机,本质是只要你的电脑上有dSYM文件,Xcode就能自动找到他并为你符号化
    2020.04.29.03.png

2.2. 通过终端命令行工具symbolicatecrash符号化
大概需要如下三个文件,下面是获取这些文件的方法

2020.04.29.04.png
  • 通过菜单Xcode -> Window -> Organizer -> Archiver找到打包的项目,右键Show In Finder,找到AppName.xcarchive,右键显示包内容,找到AppName.app.dSYM
  • 在桌面创建一个文件夹tmp,将以上两个文件拷贝到tmp文件夹中
  • 打开终端,用find /Applications/Xcode.app -name symbolicatecrash -type f查找symbolicatecrash,其中/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash路径是需要的symbolicatecrash文件,将symbolicatecrash文件也拷贝到tmp文件夹中
  • 将需要分析的crash文件也拷贝到tmp文件夹中,crash文件的格式可能是.beta.crash.ips
  • 在终端中使用以下命令行,crash文件格式以.crash为例
    1
    2
    3
    4
    5
    6
    # 进入到 tmp 文件夹中
    cd ~/Desktop/tmp

    # 分析 crash 文件,会在 `tmp` 文件夹中生成 crash.log 文件
    ./symbolicatecrash ./xxx.crash ./AppName.app.dSYM > crash.log
    或./symbolicatecrash ./xxx.crash ./.app.dSYM > crash.log
  • 如果终端报类似这样的错zsh: permission denied: ./symbolicatecrash
    说明是symbolicatecrash文件有问题,可能该文件不是本机获取的,或者是之前获取的、Xcode升级等问题造成的,重新在本机上按上面方法获取即可
  • 如果终端报类似这样的错Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash line 69.
    尝试以下命令后,再重复上面命令,正常情况就可以分析bug了export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
  1. 符号化之前,首先得确保Crash文件和dSYM这两个文件里面的UUID是一致的,如果不一致,就说明不是本次Crash对应的文件,就不能进行符号化;查看dSYM文件里面的UUID命令:dwarfdump --uuid AppName.app.dSYM;查看Crash文件文件的UUID就比较简单了,直接打开,Crash最上面的就是各种信息,不同系统版本给的格式可能会有不同,下图内容为参考
    2020.04.29.05.png
  • XcodeDebug模式下默认关闭生成dSYM文件,Release模式下默认生成dSYM文件的, 要生成dSYM文件需要查看一下项目的Build Settigns -> Build Options -> Debug information Format属性;只有该属性设置为DWARF with dSYM File时,编译才会生成dSYM文件
  • 该文是在Xcode 11.2iOS 13.2上写的教程,不同的系统版本的Xcode和手机系统获取路径和符号化方式会有变化

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK