原标题:【专家专栏】林相宇 | IOS错误日志抓取和分析

在调试自己和别人的IOS App时,发生Crash是非常正常的情况,分析这些Crash的主要手段之一就是分析Crash发生时产生的错误日志。对于未越狱的IOS设备,获取错误日志主要通过Xcode自带的日志获取功能,但是这种方式有以下两点限制:

1.只能获取开发者自己开发的App的日志,无法获取第三方App的日志。

2.自动化工作难度较高(错误日志收集,错误日志整理等)。

文中,笔者首先简单介绍了一下使用Xcode抓取和分析错误日志的方法,然后为了克服上面的两个缺陷,笔者调研了一套可自动化的第三方App在本地测试的错误日志抓取方法。最后,笔者简单介绍了一下IOS错误日志的基本构成,供读者进行日志分析和分类收集参考。

错误日志的获取

使用Xcode获取错误日志

对于自己研发并在测试机上测试的应用,我们可以通过Xcode来分析测试过程中的错误日志。但是App一但发布到AppStore,那么我们如何获取用户在使用过程中产生的错误日志呢?为了解决这一问题,苹果官方提供了一套供App开发者使用的基于Xcode工具的解决方案。

对于App在测试机上运行的情况,Xcode支持获取Apple机器的Log的情况。打开Xcode并打开自己开发的AppProject,在Window->Devices中,找到对应的设备

点击View Device Logs

在此处可以查看设备的日志信息,确认测试机连接到Mac,即可看到已经符号化完成的错误日志

对于在AppStore已经发布的App产生的错误日志,在Window->Organizer中,找到对应的App,在Crashes目录中找到AppStore下载的其他使用者使用过程中产生的错误日志。

使用命令行获取错误日志

苹果官方提供的方案虽然能够成功的获取错误日志,但是有一个前提,那就是用户必须是App的开发者,如果我们需要获取第三方开发者开发的App的错误日志,那么上述方法就不能正确的工作了。适用于这一场景的可行方案之一,是使用libimobiledevice库中的idevicecrashreport命令来获取。

libimobiledevice库:libimobiledevice 是Github上的一个开源库,主要提供和未越狱的苹果IOS设备通信的服务。包括App安装,系统日志获取,设备信息获取和错误日志获取等能力(其他具体的服务能力可以参考libimobiledevice的官网:http://www.libimobiledevice.org/)。

本文具体主要使用idevicecrashreport和ideviceinstaller命令。

假设你获取的第三方App的Ipa已经发布到App Store,那么你可以直接从App Store上下载并测试。如果未发布到App Store,则需要使用ideviceinstaller命令安装该App到指定的手机。具体的command如下:

出现如下日志后安装成功(IOS > 9的设备使用ideviceinstaller会出现Segmentation fault,但是不影响App本身的安装)

然后就可以愉快地测试App了:)

App出现Crash后,ios设备本身保留了CrashReport。为了将设备上的CrashReport拷贝到本机,就需要使用idevicecrashreport命令了。具体的command如下:

如果需要在设备上保留错误日志,使用-k选项;如果需要将crashreport单独存放,使用-e选项。

导出后的文件结构如下所示:

其中wifi为IOS的wifi信息,此处我们并不关心。我们关注其中CrashDemo开头的两个后缀为ips的文件(CrashDemo是我用来测试的App名)。使用Xcode打开一个ips文件。如下所示:

这样我们就成功得到了App的错误日志。

该方法的优点:

可以获取第三方App的错误日志。

方法全部通过命令行方式进行获取,方便编写shell进行自动化获取

该方法的缺点:

无法获得AppStore上使用者相关的错误日志。

错误日志的符号化

我们可以注意到,上述第二种错误日志的获取方法所获取到的日志,日志中的堆栈信息并不像Android等错误日志中的堆栈信息那样打印出了调用的堆栈,而是使用段基址 + 偏移地址的格式显示。除此之外,对于错误信息,也进行了相关的处理。为了能够正确的分析错误,我们需要对这些地址进行符号化,从而将日志翻译成能够处理的信息。一般来说,符号化日志需要开发者提供编译App后生成的dsym文件,该文件包含了App编译后的所有类和函数的地址信息。但是如果我们需要分析第三方开发者的App,那么我们是无法获得该App的dsym文件的。下面给出了无dsym文件场景下符号化日志信息的方法。

不带dsym文件的日志符号化

使用symbolicate符号化错误日志文件

symbolicate:symbolicate是github开源的三方脚本,该脚本使用xcode自带的符号化工具symbolicatecrash进行符号化。symbolicate支持两种符号化的方法。使用App的dsym文件和使用App的ipa解压后的App文件夹。

那么为什么不直接使用xcode的symbolicatecrash命令进行符号化呢?这一点我们可以通过分析symbolicate.sh的源码来了解。

通过分析源码,我们可以看出xcode自带的symbolicatecrash工具的主要缺陷有两点:

1. 工具随着Xcode版本有着比较大的变更。

2. 缺少对错误日志UUID和App有效性的校验。

在我们的场景中,我们没有App的dsym文件,所以我们主要依赖App的ipa解压后的文件夹来进行调试,解压ipa可以使用mac自带的unzip命令

解压后的app目录在appdirpath/Payload目录下,在Finder中显示如下:

symbolicate脚本的使用方法如下:

符号化后的错误日志文件如下:

可以看见,堆栈信息的部分的已经完成了符号化,现在我们可以开始错误日志的分析了。

错误日志的分析

在完成了错误日志的符号化之后,接下来就是对错误日志的分析了,苹果官方提供的错误日志格式还是非常详细的。下面简单介绍错误日志(CrashReport)的基本格式。

CrashReport基本格式

IOS在以下两种情况下会产生错误日志:

1.应用违反操作系统规则。

2.应用中有Bug。

1中“违反操作系统规则“主要包括watchdog终止,用户强制结束和低内存终止三种情况。

2则是应用本身导致的问题。

1和2的日志格式不同,本文主要介绍2的情况下产生的错误日志的基本格式。

下图是一个错误日志的例子

整个错误日志分为进程信息、Crash信息、Crash异常、线程回溯、线程状态和二进制映像6个部分。

进程信息:包括Crash的ID(Incident Identifier),设备的Model和标识符(CrashReporter Key和Hardware Model),App信息(Path、Identifier、Version和CodeType),以及启动的进程信息(Process、ParentProcess)。

Crash信息:包括Crash发生的时间和系统号

Crash异常:包括异常类型(Exception Type)和异常码(Exception Codes)。此处对经常出现的异常码汇总如下(苹果的异常码还是很生动的)

0x8badf00d:(ate bad food)这个异常码表示该异常是由watchdog终止引发的。

0xbad22222:这个异常码表示该异常是由VoIP被过于频繁重启引发的。

0xdeadl0cc:(dead lock)这个异常码表示该异常是由于App长期占用系统资源而被系统强行终止引发的异常。

0xdeadfa11:(dead fail)这个异常码表示该异常是由用户强制终止引发的。

线程回溯信息:

回溯信息包括四列:

帧编号

二进制库的名称

调用方法的地址

第四列分为两个子列,一个基本地址和一个偏移量。

对于未符号化的日志,这一列的内容比较难以理解

对于符号化后的日志,该列内容如下:

分别为该进程调用的函数名称和对应的代码行号

线程状态:Crash中寄存器中的值(不常用,堆栈信息足以完成大部分的Crash分析)

二进制映像:Crash发生时已经载入的二进制文件

以上就是本文的全部内容了,文中涉及到的开源库的Github地址如下:

libimobiledevice: https://github.com/libimobiledevice/libimobiledevice

symbolicate: https://github.com/JohnWong/symbolicate

作者介绍

林相宇

南京邮电大学计算机科学与技术硕士,现在百度平台测试部,主要负责百度MTC产品的IOS移动测试。返回搜狐,查看更多

责任编辑:

ios 打印 详细错误日志_【专家专栏】林相宇 | IOS错误日志抓取和分析相关推荐

  1. 嘘,我已经瞒着开发解锁APP日志文件抓取及分析啦!

    ------·今天距2020年87天·------ 这是ITester小栈第49次推文 大家好,我是coco小锦鲤 经过之前的APP系列 我们知道了APP的测试流程 也列举了APP通用测试用例 还解答 ...

  2. ios 打印 详细错误日志_iOS中打印系统详细日志

    Q:如何打印当前的函数和行号? A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号.如: 1 NSLog(@"%s:%d obj=%@", __func__, ...

  3. python读取日志错误信息_使用Python将Exception异常错误堆栈信息写入日志文件

    假设需要把发生异常错误的信息写入到log.txt日志文件中去: import traceback import logging logging.basicConfig(filename='log.tx ...

  4. mysql怎么定位错误信息_如何快速定位MySQL 的错误日志(Error Log)?

    日志文件是MySQL数据库的重要组成部分,包括有6种不同的日志文件: 错误日志: -log-err 查询日志: -log 慢查询日志: -log-slow-queries 更新日志: -log-upd ...

  5. java怎么抓取测试apk日志_Android测试日志文件抓取与分析

    1.log文件分类简介 实时打印的主要有:logcat main,logcat radio,logcat events,tcpdump,还有高通平台的还会有QXDM日志 状态信息的有:adb shel ...

  6. python编程语言排行曲线绘制_最新编程语言排名(TIOBE)-数据抓取及绘图(使用Python)...

    本章数据分析的主要步骤: 1.从网上获取公开数据:html 网页 2.读取html中表格数据 3.数据清洗和整理 4.数据绘图与可视化 5.保存绘图 接下来进行详细的说明 1.从网上获取公开数据:ht ...

  7. 实现ip数据包抓取并分析_一些网站https证书出现问题的情况分析

    20200326下午,有消息说[1]github的TLS证书出现了错误告警.证书的结构很奇怪,在其签发者信息中有一个奇怪的email地址:346608453@qq.com.明显是一个伪造的证书. 为了 ...

  8. python美女源代码_单身程序员,每晚用python抓取百万张美女图片,连女友都不想找了...

    每当夜深人静时,这位长期单身的程序员就会起床开电脑,然后用python抓取百万张美女图片,存进U盘,目的目前还不知道,但技术是万能的,这样一来,可能连找女朋友的钱都省了. 其实,还有更好看的! 而且还 ...

  9. 数据来源渠道及采集工具_几款简单好用的爬虫抓取数据采集工具

    新朋友点上方蓝字"Office交流网"快速关注 1. 火车头采集器 火车采集器我们也一直在用,是老牌的采集工具了.它不仅可做抓取工具,也可以做数据清洗.分析.挖掘已经可视化等工作. ...

最新文章

  1. leetcode--1:(python)Two Sum
  2. 旷视CEO竟遭监听敲诈:不给300万就卖敏感信息录音!网友:利好无人驾驶?
  3. vtigercrm学习(二)
  4. Funambol Developer#39;s Guide 中 connector development样例的问题
  5. 利用.net4.0的dynamic特性制造的超级简单的微信SDK
  6. mysql分布式安装可靠读写案列图解,高并发下的分布式锁-mysql篇
  7. Gateway配合sentinel自定义限流_你知道如何使用阿里Sentinel实现接口限流吗?
  8. 【Android】Android Service 服务
  9. hadoop集群崩溃恢复记录
  10. Ubuntu系统备份和恢复
  11. 微软 MVP 福利大赏
  12. 开机预读快还是不预读快_WIN 7下的超级预读比VISTA要好,改进不少!推荐开启超级预读!...
  13. java dijkstra算法代码_[转载]Java实现dijkstra算法: 地图中任意起点寻找最佳路径...
  14. integer 负数字符串比较_JAVA源码之Integer-1
  15. 内购订单进行二次处理_游戏内购要涨价?谷歌效仿苹果:安卓内购抽成30%
  16. 指令重排序导致的可见性问题
  17. Presto?还是 Hive? 你们知道大数据查询性能谁更强吗?
  18. 3串口多串口双串口以及2串口UART转WiFi多跳通讯实现二
  19. Arduino相关语法和函数
  20. 安装macOS时遇到Unable to unmount volume for repair异常导致无法完成安装的解决办法

热门文章

  1. 幸福女人的投资理财书——会理财的女人最有安全感
  2. 关于爬取吉他堂的吉他谱----Python爬虫
  3. NLog基本讲解以及使用
  4. VCR,DVR与NVR的区别
  5. 企业的重要资产——支付分账系统
  6. 【iOS】高德地图MAMapKit的使用:导航功能。
  7. 中国科学技术大学(中科大) StartOS 软件源开放啦
  8. 若依框架分离版本添加菜单图标
  9. 【软件测试】测试外包,我们该去吗?看看资深测试工程师的见解......
  10. C++星罗万象时钟罗盘