iOS开拓之Crash日志获取与剖析,iOS实时查看App运维

1、前言

从Xcode9.4开始,Devices 界面已经移除了真机设备的日志输出log,而移到macOS系统独立的控制台app(Console.app):

图片 120180713-macOS-Console.app.png

前言:

本文讨论如何实时查看输出在console控制台的日志。


前言:可能大数人看到这个标题觉得DEBUG时在Xcode里就能看到App运行时的打印在控制台里的日志,这还需要专门写篇文章介绍下吗?其实不然,有些场景下我们还是需要实时查看App运行时的日志的,比如测试人员拿着测试机发现问题了过来找你,这时候要看运行时日志,又不能重新DEBUG安装版本,怎么办?再比如,收到并点击推送的通知后启动App,这时候要查看我们打印的日志,怎么办?还有,弄过VoIP推送同学的都知道,这个推送可以直接启动我们的App,如果要观察启动过程中的日志,这该怎么办?总不能只能连着Xcode运行时,我们才能看到日志吧。有同学可能会说,把日志写入文件,启动完成后,再把文件拷贝出来看不就完了,好了,这篇文章你一定要认真看完。

当在非调试状态下,我们用真机测试app,crash或者说闪退是一件很常见的事,最让我们开发人员头疼的是,自己在开发过程中总是不会遇到crash,安装到别人的设备,就出现了闪退崩溃现象。这种偶现的、概率比较低的闪退是最令人头疼。这时iOS crash log 派上用场了,程序的大多数crash都会记录在用户的手机中,获取crash log的方法有两种:

2、控制台 Console.app

查看日志信息和报告以获取有关 Mac 和设备的诊断信息。

控制台应用很早的macOS版本就有了,但是不常用,其实Xcode中移除,也是因为与控制器功能相似,对于Xcode来说,也许真的是一个负担,并且Xcode现在bug已经够多了,移除也是一个好事吧。

可以直接看苹果文档:欢迎使用控制台 - Apple 支持

一、Xcode

通过Window->Devices打开devices界面,选择我们的手机,也能看到手机中运行的进程输出的日志。如图:

图片 2

devices.png


这里我们说的日志是输出到控制台的日志,就是我们常用的NSLog输出的日志。其实大部分App会集成日志模块,比如CocoaLumberjack,还有以前笔者学习Runloop时也造过这样的轮子SSLogger。利用第三方日志模块查看日志不在本文讨论范围内,本文只讨论如何实时查看输出在console控制台的日志。

  • 用户把设备连接到电脑上,打开xcode-window,选中Devices-当前连接设备-Device Log,就可以查看所有当前设备的crash log,这个时候打开每一份crash的时候,发现这些文件的部分地址都会被转换成,类名,方法名和行号等。设备上的日志只用刚刚查看过都会被同步到organizer种,在LIBRARY下的Device Log可以查看。
  • 如果你的应用已经上架,那么开发者可以通过iTunes Connect(Manage Your Applications - View Details - Crash Reports)获取用户的crash日志。不过这并不是100%有效的,而且大多数开发者并不依赖于此,因为这需要用户设备同意上传相关信息,详情可参见iOS: Providing Apple with diagnostics and usage information摘要。

3、一些技巧

相对于以前想看设备的日志,其实,控制台可谓更轻量,更快捷,更专业吧。下面就说说一些技巧:

  • 筛选所需我们打开控制台的目的,一般都是调试我们自己开发的iOS应用吧!这时候,链接设备后,其实我们只关心我们自己的应用的日志,但默认情况下,会显示所有应用当前输出的日志,这时候,筛选所需显得很有必要!找到你应用输出的一条日志,然后鼠标右键(或按住 Control 键点按日志信息),然后选择 显示“进程'XXX'”

图片 320180713-macOS-Console-Filter-Process-Items.png

这里示例WeRead的进程筛选,然后就会只显示这个应用的全部日志,相对于Xcode的日志界面,其实非常方便啦~

图片 420180713-macOS-Console-Filter-Process-Items-activity.png

  • 显示所需另一方面,第一条日志默认只显示一行,如果想显示全部,可以点击后,在下方显示具体的内容:

图片 520180713-macOS-Console-Show-Items.png

如果用快捷键左右箭头键可以快速在当前选择的行显示全部的内容:

图片 620180713-macOS-Console-Show-Specific-Items.png

二、libimobiledevice

安装libimobiledevice很简单,在命令行输入:

brew install --HEAD libimobiledevice 
注意,需要加上 –HEAD 选项,如果不加,安装是老版本,不支持iOS10的手机,所以安装时,需要加上 –HEAD 选项

1、使用idevicesyslog

在命令行输入:idevicesyslog

就可以在屏幕上看见手机上所有的日志了。

图片 7

log.png

2、查看我们想要的日志

1)将设备日志重定向到文件

idevicesyslog >> iphone.log &
该命令是将日志导入到iphone.log这个文件,并且是在后台执行。

2)用tail -f和grep查看log

tail -f iphone.log
tail -f iphone.log | grep 'QQ' # 查看包含QQ的行

如下图:

图片 8

QQ.png


查看日志几种常用的方式:

当上面方法都不行时,就是说在Devices看不到logs时,那就用下面的方法来获取crash日志文件设备连接iTune,选择设备和mac同步文件,然后保存在手机里的crash日志文件将会同步到电脑,目录在~/Library/Logs/CrashReporter/MobileDevice/xxx的 iPhone如下图,就是所有的crash文件:

4、快捷键

使用键盘快捷键快速完成“控制台”中的许多任务。

快捷键 说明
Command-Option-F 搜索日志信息和活动
Command-F 在日志信息中查找文本
Command-G 跳到下一条搜索结果
Command-Shift-G 跳到上一条搜索结果
Command-K 清除日志信息或活动
Shift-Command-R 重新载入日志信息或活动
Shift-Command-N 跳到最近的日志信息或活动
Command-0 显示或隐藏边栏
Command-R 在 Finder 中显示报告
在本行展开所选日志信息
在本行折叠所选日志信息
Control-Command-F 进入或退出全屏幕视图
Command-C 拷贝所选日志信息文本

三、控制台

在用过各种办法查看App日志后,还是觉得苹果系统自带的工具用起来最方便,不用安装,不用命令行,傻瓜式操作,非常方便。

连上手机,在LaunchPad其他文件中打开控制台应用,或者搜索Console.app打开控制台应用,可以看到左侧一栏中有我们的手机设备,选择就可以,如图:

图片 9

控制台.png

右侧输出的日志不仅有我们自己的App还有其他进程的日志,怎么过滤?非常简单,选中一条我们的日志,在进程名字上右键,选择显示进程名,然后就只会显示我们App的日志。如果显示的列名中没有进程名,我们可以在其他列名上右键,在弹出的菜单中勾选上进程就可以了。如图显示WeChat打印出的日志:

图片 10

WeChat1.png

图片 11

WeChat2.png


以上,按照个人习惯来选择工具即可。

1.连着Xcode调试时,可以直接在Xcode下面的控制台输出面板上我们看到的App的日志。

图片 12Paste_Image.png

5、总结

这个过程,大家也许会发现,用快捷键是提高效率的直接方式,用 Alfred 来打开也很方便(后面计划写一个Alfred开发者效率的文章,期待吧!)。刚开始,也许对于打开控制台查看日志log输出不习惯,但有时候只是查看日志排查问题,直接打开 Console.app 真的方便很多(你知道打开Xcode需要的时候更久,并且在打开Devices更是久啊),所以,综上,这个控制台 Console.app也是一件好事!

说到这里,其实,我更想吐槽的是Xcdoe!!!越来越庞大,还有Swift的交替,还有功能更强大?直接导致品控越来越差。所以,从这个角度来看,苹果把Xcode的很多相关但不重要的功能单独出来,也许是到于Xcode开发团队来说,是一件好事,到后续的版本迭代也是好事吧,希望Xcode10给开发者带来体验!期待9月!!

2.也是Xcode,通过Windows--->Devices打开devices界面,选择我们的手机,也能看到手机中运行的进程输出日志。

打开crash日志文件,你会有点蒙圈,因为全都是十六进制的数据

6、参考

  • 欢迎使用控制台 - Apple 支持
  • 如有疑问,欢迎在评论区一起讨论!
  • 如有不正确的地方,欢迎指导!

注:本文首发于 iHTCboy's blog,如若转载,请注来源

3.使用Mac自带的控制台应用查看Ios日志

图片 13Paste_Image.png

连上手机,在LaunchPad其他文件中华打开控制台应用,或者搜索Console.app打开控制台应用,可以看到左侧一栏中有我们的设备,选择就可以。

常见的Exception Type & Exception Code1、Exception Type1)EXC_BAD_ACCESS此类型的Excpetion是我们最长碰到的Crash,通常用于访问了不改访问的内存导致。一般EXC_BAD_ACCESS后面的"()"还会带有补充信息。SIGSEGV: 通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。**SIGABRT: ** 收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。SEGV:(Segmentation Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出等;SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常SIGILL:尝试执行非法的指令,可能不被识别或者没有权限2)EXC_BAD_INSTRUCTION此类异常通常由于线程执行非法指令导致3)EXC_ARITHMETIC除零错误会抛出此类异常2、Exception Code**0xbaaaaaad **此种类型的log意味着该Crash log并非一个真正的Crash,它仅仅只是包含了整个系统某一时刻的运行状态。通常可以通过同时按Home键和音量键,可能由于用户不小心触发0xbad22222当VOIP程序在后台太过频繁的激活时,系统可能会终止此类程序0x8badf00d这个前面已经介绍了,程序启动或者恢复时间过长被watch dog终止0xc00010ff程序执行大量耗费CPU和GPU的运算,导致设备过热,触发系统过热保护被系统终止0xdead10cc程序退到后台时还占用系统资源,如通讯录被系统终止0xdeadfa11前面也提到过,程序无响应用户强制关闭

日志还是有点多,看不清,怎么办,在右上方输入自己想要过滤出的日志,然后就会显示你想要的,如图显示QQ打印出来的日志。

其实,crash log里关键的信息就在backtrace,对linux有一定了解的相信对backtrace是有所了解的,其实Linux下常常利用backtrace追踪函数调用堆栈以及定位段错误

那关键的来了,把Backtrace的十六进制数据转成我们能看懂的文字,这个过程我们称之为符号化,那么我们就一步一步讲解

  • 1.上述获取到log后,我们首先找到相对应的.dSYM文件,在哪呢?就在这个目录里: ~/Library/Developer/Xcode/Archives/
  • 2.进入这个目录后,可能会有多个archive文件,找到对应时间的,然后右键显示包内容,可以看到,xxx.app.dSYM文件,如下图:

图片 14Paste_Image.png

  • 3.然后再找到上述图片Products/Applications/xxx.app文件
  • 4.将上面crash log文件,xxx.app.dSYM和xxx.app文件拷贝到同一个文件里

怎么确定.dSYM和.app文件是同一个编译出来的呢?打开终端,使用命令查看两个文件的uuid是否一致,一致则表示.dSYM文件和.app文件是相匹配的,命令如下:dwarfdump --uuid xxx.app/xxxdwarfdump --uuid xxx.app.dSYM/ (xxx为app name

  • 5.然后使用命令行工具symbolicatecrash来符号化crash log

怎么找到symbolicatecrash呢?其实symbolicatecrash工具是Xcode自带的一个命令行工具,找它,当然是去xcode的安装目录咯先到xcode安装去,一层一层往下走 /Applications/Xcode.app/Contents/SharedFrameworks这里偷个懒不去找symbolicatecrash在哪个目录了,直接输入查找命令来找find ./ -name "symbolicatecrash",如下图

图片 15Paste_Image.png到这个目录去,把这个工具拷贝到和上述文件同一个目录sudo cp symbolicatecrash ~/Desktop/xxxxx/xxx

然后就开始符号化,执行命令:./symbolicatecrash appName-2016-10-26-201420.crash appName.app.dSYM/ > xxxxx.log(如果执行命令出现错误:Error: "DEVELOPER_DIR" is not defined at ./symbolicatecrash,请设置环境变量:export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer;)打开日志文件,你会发现,backtrace就变成我们可以读懂的代码方法和精准定位到了哪一行了,哈哈

图片 16Paste_Image.png

太好用了,这样就遇到偶现的闪退,我们就可以比较轻松的定位问题,最快的定位问题,最好解决问题。

总结

总结一下,整个过程就是,获取crash log -》找到相匹配的 app文件 -》 获取symbolicatecrash工具 -》 符号化crash文件。希望这个对大家有所帮助。

本文由星彩网app下载发布于计算机编程,转载请注明出处:iOS开拓之Crash日志获取与剖析,iOS实时查看App运维

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。