iOS 测试 [libimobiledevice 优化] iOS Crash 日志获取工具 idevicecrashreport 功能优化

Baozhida · 2017年03月22日 · 2898 次阅读

接着 Macaca 实现 IOS Monkey 测试 聊,c 语言早就忘干净了,各种语言都是相通的,连蒙带猜的方式修改了 idevicecrashreport.c 文件,优化了一个功能,新增了一个功能。

idevicecrashreport 的问题

打算使用 idevicecrashreport 处理 crash 报告,但是发现 idevicecrashreport 一年多没有更新了,使用过程中发现一些问题

原版执行的结果如下,两个问题

  • 1./WiFi/WiFiManager/wifi-buf-02-17-2017__11:37:19.log log 文件是完全没有必要下载的
  • 2./JetsamEvent-2017-03-22-091417.ips 非测试 app 的 crash 文件,我期望可以过滤下载
MACdeMacBook-Pro:log MAC$ /usr/local/bin/idevicecrashreport -k .
Copy: /JetsamEvent-2017-03-22-091417.ips
Copy: /TuNiuApp-2017-03-21-184033.ips
Copy: /WiFi/WiFiManager/wifi-buf-02-17-2017__11:37:19.log
Copy: /WiFi/WiFiManager/wifi-buf-02-17-2017__14:30:48.log
Copy: /WiFi/WiFiManager/wifi-buf-02-17-2017__15:50:44.log
Copy: /WiFi/WiFiManager/wifi-buf-02-19-2017__16:12:35.log
Copy: /WiFi/WiFiManager/wifi-buf-02-22-2017__11:49:01.log
Copy: /WiFi/WiFiManager/wifi-buf-02-22-2017__12:02:49.log
Copy: /WiFi/WiFiManager/wifi-buf-03-03-2017__14:34:33.log
Copy: /WiFi/WiFiManager/wifi-buf-03-03-2017__14:47:16.log
Copy: /WiFi/WiFiManager/wifi-buf-03-06-2017__18:11:38.log
Copy: /WiFi/WiFiManager/wifi-buf-03-06-2017__21:31:36.log
Copy: /WiFi/WiFiManager/wifi-buf-03-10-2017__16:33:06.log
Copy: /WiFi/WiFiManager/wifi-buf-03-16-2017__01:11:13.log
Copy: /mediaserverd.apscal-2017-03-21.log
Done.
MACdeMacBook-Pro:log MAC$ 
  • 针对第一个问题,在 idevicecrashreport 脚本复制设置的文件执行先判断是否是 .ips 文件,否则不下载。

  • 针对第二个问题,在 idevicecrashreport 脚本加了一个过滤文件名称的参数 -g || -grep ,比如过滤文件名 包含 TuNiuApp 的文件,只下载 TuNiuApp 的 crash 日志,其他 app 的 crash 日志不处理。

帮助命令可以查看添加的功能

MACdeMacBook-Pro:log MAC$ /usr/local/bin/idevicecrashreport -h
Usage: idevicecrashreport [OPTIONS] DIRECTORY
Move crash reports from device to a local DIRECTORY.

  -e, --extract     extract raw crash report into separate '.crash' file
  -k, --keep        copy but do not remove crash reports from device
  -d, --debug       enable communication debugging
  -u, --udid UDID   target specific device by its 40-digit device UDID
  -g, --grep        grep crash filename
  -h, --help        prints usage information

Homepage: <http://libimobiledevice.org>

实际使用效果如下:

MACdeMacBook-Pro:log MAC$ /usr/local/bin/idevicecrashreport -k -g TuNiuApp .
Copy: /TuNiuApp-2017-03-21-184033.ips
Done.
MACdeMacBook-Pro:log MAC$ 

github

地址:https://github.com/baozhida/libimobiledevice

修改的文件 :https://github.com/baozhida/libimobiledevice/blob/master/tools/idevicecrashreport.c

直接下载然后自己编译,编译方式同第一行提到的帖子

PS 题外话

自动获取 crash 日志可以通过 idevicecrashreport 脚本完成了,下面计划完成自动解析 crash 文件(xcode 查看 crash 日志,有些可以直接符号化,一些则不能,需要借助.dsYM 文件和 symbolicatecrash 脚本完成解析,没有 xcode 打开查看过的 crash 直接使用 idevicecrashreport 下载的 crash 文件都是没有符号化处理的)

什么是符号表

符号表就是指在 Xcode 项目编译后,在编译生成的二进制文件.app 的同级目录下生成的同名的.dSYM 文件。

.dSYM 文件其实是一个目录,在子目录中包含了一个 16 进制的保存函数地址映射信息的中转文件,所有 Debug 的 symbols 都在这个文件中 (包括文件名、函数名、行号等),所以也称之为调试符号信息文件。

符号表有什么用

符号表就是用来符号化 crash log(崩溃日志)。crash log 中有一些方法 16 进制的内存地址等,通过符号表就能找到对应的能够直观看到的方法名之类。

如何得到.dsYM 文件

我们在 Archive 的时候会生成.xcarchive 文件,然后显示包内容就能够在里面找到.dsYM 文件和.app 文件。

Done

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 7 条回复 时间 点赞
Baozhida 关闭了讨论 03月22日 10:53
Baozhida 重新开启了讨论 03月22日 10:53

又是你 你就好比漆黑夜里的萤火虫 那么的拉风 那么的耀眼。

老马 回复

谢谢夸奖☺

期待解析后的 crash 文件


楼主,为什么我导出 crash 文件时,只是提示 Done,但并没有导出任何文件。

执行的时候遇见 openssl 版本报错的问题,解决方法如下:
https://www.jianshu.com/p/aff1773943fd

你好,运行:idevicecrashreport -k -g TuNiuApp .
出现 ERROR: Could not connect to lockdownd, error code -3
这个什么原因呢?

匿名 #10 · 2019年09月30日
yujie 回复

brew install --HEAD libimobiledevice -g
brew link libimobiledevice
brew link --overwrite libimobiledevice

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册