ios手机测试时怎么拿到app的崩溃日志
一、如何获得crash日志
当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上。这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人员定位问题很有帮助。
如果设备就在身边,可以连接设备,打开Xcode - Window - Organizer,在左侧面板中选择Device
Logs(可以选择具体设备的Device Logs或者Library下所有设备的Device
Logs),然后根据时间排序查看设备上的crash日志。这是开发、测试阶段最经常采用的方式。
如果应用程序已经提交到App Store发布,用户已经安装使用了,那么开发者可以通过iTunes Connect(Manage Your
Applications - View Details - Crash
Reports)获取用户的crash日志。不过这并不是100%有效的,而且大多数开发者并不依赖于此,因为这需要用户设备同意上传相关信息,详情可参见iOS:
Providing Apple with diagnostics and usage information摘要。
考虑到并不是所有iPhone用户都允许自动发送诊断报告(crash日志),而且对于部分提交到Apple得crash日志,开发者还需要手动去拉取,然后找到对应的符号文件进行解析——这是一件很繁琐的事情。所以实际项目开发中,通常接入现有的crash收集工具(参考1,参考2),或者自己编写一个进行自动化收集、解析和统计汇总。
二、如何解析crash日志
当获得一份crash日志时,我们需要将初始展示的十六进制地址等原始信息映射为源代码级别的方法名称和代码行数,使其对开发人员可读。这个过程称为符号化解析。要成功地符号化解析一份crash日志,我们需要有对应的应用程序二进制文件以及符号(.dSYM)文件。
如果处于开发调试阶段,通常Xcode都能匹配到crash日志对应的二进制文件和符号文件,所以能够帮我们自动解析。
如果处于测试阶段,测试人员已经安装了不同的版本(比如alpha、beta版本),那么需要保存好对应版本的二进制文件和符号文件,以便在应用程序崩溃时对crash日志进行解析。对于这种场景下产生的crash日志,只需要将.crash文件、.app文件和.dSYM文件三者放在同一个目录下,然后将.crash文件拖放到Xcode
- Window - Organizer中左侧面板Library下的Device Logs中,即可进行解析。
如果要提交发布,那么我们通常会先执行Clean,再Build,最后通过Product -
Archive来打包。这样,Xcode会将二进制文件和符号文件归档在一起,可以通过Organizer中的Archives进行浏览。
三、如何分析crash日志
在分析一份crash日志之前,如果开发人员对于常见的错误类型有所了解,那定是极好的。
crash日志的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug。
1. iOS策略
1.1 低内存闪退
前面提到大多数crash日志都包含着执行线程的栈调用信息,但是低内存闪退日志除外,这里就先看看低内存闪退日志是什么样的。
我们使用Xcode 5和iOS
7的设备模拟一次低内存闪退,然后通过Organizer查看产生的crash日志,可以发现Process和Type都为Unknown:
而具体的日志内容如下:
第一部分是崩溃信息,包括识别标识、软硬件信息和时间信息等。
第二部分是内存页分配信息,以及当前占用内存最多的进程,上图中为crashTypeDemo。
第三部分是具体的进程列表,描述着每个进程使用内存的情况以及当前状态。在较早的版本中可以在某些进程后面看到“jettisoned”字样,表明这些进程使用过多内存被终止了,而现在我们看到的是“vm-pageshortage”字样。
当iOS检测到内存过低时,它(的VM系统)会发出低内存警告通知,尝试回收一些内存;如果情况没有得到足够的改善,iOS会终止后台应用以回收更多内存;最后,如果内存还是不足,那么正在运行的应用可能会被终止掉。
所以,我们的应用应该合理地响应系统抛出来的低内存警告通知,对一些缓存数据和可重新创建的对象进行释放,同时要避免出现内存泄露等问题。
低内存闪退是由iOS策略决定终止应用程序运行的,同样基于iOS策略的还有Watchdog超时和用户强制退出。
1.2 Watchdog超时
Apple的iOS Developer
Library网站上,QA1693文档中描述了Watchdog机制,包括生效场景和表现。如果我们的应用程序对一些特定的UI事件(比如启动、挂起、恢复、结束)响应不及时,Watchdog会把我们的应用程序干掉,并生成一份响应的crash报告。
这份crash报告的有趣之处在于异常代码:“0x8badf00d”,即“ate bad food”。
如果说特定的UI事件比较抽象,那么用代码来直接描述的话,对应的就是(创建一个工程时Xcode自动生成的)UIApplicationDelegate的几个方法:
所以当遇到Watchdog日志时,可以检查下上图几个方法是否有比较重的阻塞UI的动作。
QA1693举的例子是在主线程进行同步网络请求。如果我们是在公司的Wifi环境下使用则一切顺利,但当应用程序发布出去面向很大范围的用户,在各种网络环境下运行,则不可避免地会出现一片Watchdog超时报告。
另一种可能出现问题的场景就是数据量比较大的情况下进行的数据库版本迁移(同样是在主线程上),这也是促使我写这篇总结的一个直接因素。
1.3 用户强制退出
一看到“用户强制退出”,首先可能想到的双击Home键,然后关闭应用程序。不过这种场景是不会产生crash日志的,因为双击Home键后,所有的应用程序都处于后台状态,而iOS随时都有可能关闭后台进程,所以这种场景没有crash日志。
另一种场景是用户同时按住电源键和Home键,让iPhone重启。这种场景会产生日志(仅验证过一次),但并不针对特定应用程序。
这里指的“用户强制退出”场景,是稍微比较复杂点的操作:先按住电源键,直到出现“滑动关机”的界面时,再按住Home键,这时候当前应用程序会被终止掉,并且产生一份相应事件的crash日志。
通常,用户应该是遇到应用程序卡死,并且影响到了iOS响应,才会进行这样的操作——不过感觉这操作好高级,所以这样的crash日志应该比较少见。
2. 常见错误标识
2.1 Exception codes
上面“用户强制退出”的crash日志中的Exception
Codes是“0xdeadfa11”,再上面“Watchdog超时”的crash日志中的Exception
Codes是“0x8badf00d”,这些都是特有的Exception codes。
根据官方文档描述,至少有以下几种特定异常代码:
0x8badf00d错误码:Watchdog超时,意为“ate bad food”。
0xdeadfa11错误码:用户强制退出,意为“dead fall”。
0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。
0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。
0xc00010ff错误码:因为太烫了被干掉,意为“cool off”。
0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”。
2.2 Exception types
查看我们的crash分析报告邮件,会发现最经常遇到的错误类型是SEGV(Segmentation
Violation,段违例),表明内存操作不当,比如访问一个没有权限的内存地址。
当我们收到SIGSEGV信号时,可以往以下几个方面考虑:
访问无效内存地址,比如访问Zombie对象;
尝试往只读区域写数据;
解引用空指针;
使用未初始化的指针;
栈溢出;
此外,还有其它常见信号:
SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;
SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);
SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;
SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;
SIGPIPE:管道另一端没有进程接手数据;
3. 代码bug
此外,比较常见的崩溃基本都源于代码bug,比如数组越界、插空、多线程安全性、访问野指针、发送未实现的selector等。如果引入Core
Data,则又有另外一些常见问题,不过这是另一个话题了。
遇到这些bug时,都有比较清楚的错误原因说明,比如“index 0 beyond bounds for empty
array”等。需要稍微注意点的是多线程问题,当一时找不到解决思路时,不妨往多线程方面考虑下。
一、先分析app的崩溃的分布情况 这个需要有(iTunes connect账号),通过分析可以查看到自己的app奔溃主要发生在那些机型上。 如果没有账号,别着急,直接走第二步。 二、打开xcode,下载崩溃日志,直接定位出问题代码行。
一、如何获得crash日志当一个iOS应用程序崩溃时,系统会创建一份crash日志保存在设备上。这份crash日志记录着应用程序崩溃时的信息,通常包含着每个执行线程的栈调用信息(低内存闪退日志例外),对于开发人员定位问题很有帮助。
如果设备就在身边,可以连接设备,打开Xcode - Window - Organizer,在左侧面板中选择Device
Logs(可以选择具体设备的Device Logs或者Library下所有设备的Device
Logs),然后根据时间排序查看设备上的crash日志。这是开发、测试阶段最经常采用的方式。
如果应用程序已经提交到App Store发布,用户已经安装使用了,那么开发者可以通过iTunes Connect(Manage Your
Applications - View Details - Crash
Reports)获取用户的crash日志。不过这并不是100%有效的,而且大多数开发者并不依赖于此,因为这需要用户设备同意上传相关信息,详情可参见iOS:
Providing Apple with diagnostics and usage information摘要。
考虑到并不是所有iPhone用户都允许自动发送诊断报告(crash日志),而且对于部分提交到Apple得crash日志,开发者还需要手动去拉取,然后找到对应的符号文件进行解析——这是一件很繁琐的事情。所以实际项目开发中,通常接入现有的crash收集工具(参考1,参考2),或者自己编写一个进行自动化收集、解析和统计汇总。
二、如何解析crash日志
当获得一份crash日志时,我们需要将初始展示的十六进制地址等原始信息映射为源代码级别的方法名称和代码行数,使其对开发人员可读。这个过程称为符号化解析。要成功地符号化解析一份crash日志,我们需要有对应的应用程序二进制文件以及符号(.dSYM)文件。
如果处于开发调试阶段,通常Xcode都能匹配到crash日志对应的二进制文件和符号文件,所以能够帮我们自动解析。
如果处于测试阶段,测试人员已经安装了不同的版本(比如alpha、beta版本),那么需要保存好对应版本的二进制文件和符号文件,以便在应用程序崩溃时对crash日志进行解析。对于这种场景下产生的crash日志,只需要将.crash文件、.app文件和.dSYM文件三者放在同一个目录下,然后将.crash文件拖放到Xcode
- Window - Organizer中左侧面板Library下的Device Logs中,即可进行解析。
如果要提交发布,那么我们通常会先执行Clean,再Build,最后通过Product -
Archive来打包。这样,Xcode会将二进制文件和符号文件归档在一起,可以通过Organizer中的Archives进行浏览。
三、如何分析crash日志
在分析一份crash日志之前,如果开发人员对于常见的错误类型有所了解,那定是极好的。
crash日志的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug。
1. iOS策略
1.1 低内存闪退
前面提到大多数crash日志都包含着执行线程的栈调用信息,但是低内存闪退日志除外,这里就先看看低内存闪退日志是什么样的。
我们使用Xcode 5和iOS
7的设备模拟一次低内存闪退,然后通过Organizer查看产生的crash日志,可以发现Process和Type都为Unknown:
而具体的日志内容如下:
第一部分是崩溃信息,包括识别标识、软硬件信息和时间信息等。
第二部分是内存页分配信息,以及当前占用内存最多的进程,上图中为crashTypeDemo。
第三部分是具体的进程列表,描述着每个进程使用内存的情况以及当前状态。在较早的版本中可以在某些进程后面看到“jettisoned”字样,表明这些进程使用过多内存被终止了,而现在我们看到的是“vm-pageshortage”字样。
当iOS检测到内存过低时,它(的VM系统)会发出低内存警告通知,尝试回收一些内存;如果情况没有得到足够的改善,iOS会终止后台应用以回收更多内存;最后,如果内存还是不足,那么正在运行的应用可能会被终止掉。
所以,我们的应用应该合理地响应系统抛出来的低内存警告通知,对一些缓存数据和可重新创建的对象进行释放,同时要避免出现内存泄露等问题。
低内存闪退是由iOS策略决定终止应用程序运行的,同样基于iOS策略的还有Watchdog超时和用户强制退出。
1.2 Watchdog超时
Apple的iOS Developer
Library网站上,QA1693文档中描述了Watchdog机制,包括生效场景和表现。如果我们的应用程序对一些特定的UI事件(比如启动、挂起、恢复、结束)响应不及时,Watchdog会把我们的应用程序干掉,并生成一份响应的crash报告。
这份crash报告的有趣之处在于异常代码:“0x8badf00d”,即“ate bad food”。
如果说特定的UI事件比较抽象,那么用代码来直接描述的话,对应的就是(创建一个工程时Xcode自动生成的)UIApplicationDelegate的几个方法:
所以当遇到Watchdog日志时,可以检查下上图几个方法是否有比较重的阻塞UI的动作。
QA1693举的例子是在主线程进行同步网络请求。如果我们是在公司的Wifi环境下使用则一切顺利,但当应用程序发布出去面向很大范围的用户,在各种网络环境下运行,则不可避免地会出现一片Watchdog超时报告。
另一种可能出现问题的场景就是数据量比较大的情况下进行的数据库版本迁移(同样是在主线程上),这也是促使我写这篇总结的一个直接因素。
1.3 用户强制退出
一看到“用户强制退出”,首先可能想到的双击Home键,然后关闭应用程序。不过这种场景是不会产生crash日志的,因为双击Home键后,所有的应用程序都处于后台状态,而iOS随时都有可能关闭后台进程,所以这种场景没有crash日志。
另一种场景是用户同时按住电源键和Home键,让iPhone重启。这种场景会产生日志(仅验证过一次),但并不针对特定应用程序。
这里指的“用户强制退出”场景,是稍微比较复杂点的操作:先按住电源键,直到出现“滑动关机”的界面时,再按住Home键,这时候当前应用程序会被终止掉,并且产生一份相应事件的crash日志。
通常,用户应该是遇到应用程序卡死,并且影响到了iOS响应,才会进行这样的操作——不过感觉这操作好高级,所以这样的crash日志应该比较少见。
2. 常见错误标识
2.1 Exception codes
上面“用户强制退出”的crash日志中的Exception
Codes是“0xdeadfa11”,再上面“Watchdog超时”的crash日志中的Exception
Codes是“0x8badf00d”,这些都是特有的Exception codes。
根据官方文档描述,至少有以下几种特定异常代码:
0x8badf00d错误码:Watchdog超时,意为“ate bad food”。
0xdeadfa11错误码:用户强制退出,意为“dead fall”。
0xbaaaaaad错误码:用户按住Home键和音量键,获取当前内存状态,不代表崩溃。
0xbad22222错误码:VoIP应用(因为太频繁?)被iOS干掉。
0xc00010ff错误码:因为太烫了被干掉,意为“cool off”。
0xdead10cc错误码:因为在后台时仍然占据系统资源(比如通讯录)被干掉,意为“dead lock”。
2.2 Exception types
查看我们的crash分析报告邮件,会发现最经常遇到的错误类型是SEGV(Segmentation
Violation,段违例),表明内存操作不当,比如访问一个没有权限的内存地址。
当我们收到SIGSEGV信号时,可以往以下几个方面考虑:
访问无效内存地址,比如访问Zombie对象;
尝试往只读区域写数据;
解引用空指针;
使用未初始化的指针;
栈溢出;
此外,还有其它常见信号:
SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;
SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);
SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;
SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;
SIGPIPE:管道另一端没有进程接手数据;
3. 代码bug
此外,比较常见的崩溃基本都源于代码bug,比如数组越界、插空、多线程安全性、访问野指针、发送未实现的selector等。如果引入Core
Data,则又有另外一些常见问题,不过这是另一个话题了。
遇到这些bug时,都有比较清楚的错误原因说明,比如“index 0 beyond bounds for empty
array”等。需要稍微注意点的是多线程问题,当一时找不到解决思路时,不妨往多线程方面考虑下。
做Android 手机软件测试需要掌握哪些工具
请注意测试本身不是靠工具的而是靠设计,这是我的理念,所以我一向觉得,很多人认为做测试做的好就是靠掌握一门好的工具,这个观点是不正确的,所以我可以负责任的告诉你,做Android手机需要掌握的不是工具、而是理念、思维、以及框架,总的来说是本质,而工具只是辅助,那么现在我来介绍一些我了解的工具...
鸿蒙OS手机版测试版何时对华为Mate 40系列开放?
华为Mate 40系列抢先升级鸿蒙OS手机版测试版<\/ 华为软件部副总裁毛玉敏透露,12月16日,一款全新的鸿蒙手机开发者Beta版将揭开其神秘面纱,华为Mate 40系列将有幸率先体验。尽管此次发布的仍为测试版,但标志着鸿蒙OS手机版的正式到来已为期不远。华为早在2016年就开始了鸿蒙系统的研发计划,以万物互联为...
游戏手机测试你的手机
甚至可能是中文的。运行游戏或应用:大多数支持MRP的手机在娱乐或游戏菜单中设有游戏中心或工具箱,打开后即可找到你下载的MRP软件或游戏。如果找不到,可以尝试输入*#220807#打开游戏列表,或者下载dsm_gm.mrp驱动文件,该文件适用于出厂时屏蔽游戏列表的手机,例如预装了SKYEngine但缺少游戏列表的设备。
华为鸿蒙2.0系统怎么样 鸿蒙2.0系统功能介绍
未来应该会有更多的支持EMUI11系统的机型可升级到鸿蒙OS手机版。目前鸿蒙手机版正公开招募测试用户,可在官网直接报名。如果获得测试资格,将会收到一封确认电子邮件,之后会推送更新到你的手机或平板电脑,届时就可以直接从EMUI11(11.0.0.145)上通过OTA方式升级到鸿蒙,具体操作:执行“服务-升级尝鲜-...
苹果生产手机这么大量,系统是一台一台刷进去的吗?不是很费时间吗?_百...
只要上一个工站,没有检测合格,下一个站就会提示漏测,一般漏测会有提示,出现漏测也会上传到主管那里组长那里的会查询出来谁是漏测的,大概就是这几个流程,合格以后进行封装盖板,送入下一车间。关于人们说的一个一个刷入 从软硬件方面定制出一套自动化流程. 例如: 手机cpu在flash里面没有OS的...
安卓检测硬件的软件安卓检测硬件
一加8pro如何测试屏幕?可以进入手机工程模式测试屏幕。一加手机进入工程模式方法:在桌面中,点击“电话”进入拨号界面,在拨号界面输入星号井号808井号即可进入工程模式。工程模式:谷歌公司在设计安卓系统时候就秉承开源开放的宗旨,能够给用户最大的控制力。谷歌便为用户带来了手机工程模式,它是一种系统层级...
vivo手机怎么检查电池
演示机型:vivo X20 系统版本:Funtouch OS 3.2 如果您想查看您vivo手机的电池健康情况,可以按照以下四个简单的步骤进行操作:第一步:打开拨号界面 首先,打开您的vivo手机,进入拨号界面。第二步:输入代码 在拨号界面中,输入代码“*#*#4636#*#*”。第三步:进入工程测试环境 输入代码后,您的...
vivoS1pro怎么测试电池温度
夏天来临,温度是一点一点的在升高,我们在玩手机的时候玩的越久,手机温度越高,而手机发热的原因大部分是手机电池的问题,那么vivoS1pro怎么测试电池温度呢?接下开一起看看吧。vivoS1pro怎么测试电池温度注:本文以vivoS1pro手机为例,适用于Funtouch OS9系统。1、按电源键亮屏手机,而后按住这个往上...
如何检测自己手机的电池健康度?
演示机型:vivo X20 系统版本:Funtouch OS 3.2 如果您想查看您vivo手机的电池健康情况,可以按照以下四个简单的步骤进行操作:第一步:打开拨号界面 首先,打开您的vivo手机,进入拨号界面。第二步:输入代码 在拨号界面中,输入代码“*#*#4636#*#*”。第三步:进入工程测试环境 输入代码后,您的...
手机开不开机了,怎么测试屏幕坏没坏?
(1)可能是电量已耗尽,建议您使用标配充电器持续充电30分钟以上,然后再尝试开机。(2)建议您长按电源键15秒以上,尝试强制重启手机。(3)如果以上方法未能解决您的问题,请您提前备份好数据(QQ,微信等第三方应用需单独备份)并携带相关购机凭证到附近的华为客户服务中心检修。3、开机进入Harmony OS...
答永复肾: 一、先分析app的崩溃的分布情况 这个需要有(iTunes connect账号),通过分析可以查看到自己的app奔溃主要发生在那些机型上. 如果没有账号,别着急,直接走第二步. 二、打开xcode,下载崩溃日志,直接定位出问题代码行.
孟连傣族拉祜族佤族自治县18563322920: 如何用苹果手机安装测试版ios应用 - ?
答永复肾: 如果你要安装的应用没有发布到app store的话,只能手机越狱后安装.
孟连傣族拉祜族佤族自治县18563322920: iOS怎么获取已经安装的APP - ?
答永复肾: 请不要用91!! 从iTunes Store里下好 再同步就行了. 越狱的软件下好安装包 再拖进iTunes 再同步就行了.告诫LZ千万不要用91,不然白苹果就不好了
孟连傣族拉祜族佤族自治县18563322920: 测试iOS App 时需要注意什么 - ?
答永复肾: 测试IOS APP应用注意事项:1、检测app密钥是否正常运作,每个ID对应一个密钥,在密钥错误时,应用时候提示重新登陆窗口.2、检测应用时候有闪退现象.3、检测截屏、音量操作是否会产生BUG.4、检测网络是否能正常接入以及应用内文字、图片信息是否完整.5、检测app是否存在乱码.6、应用简述中是否有苹果禁止的词汇,例如android、安卓等
孟连傣族拉祜族佤族自治县18563322920: 苹果手机售后检测出来应用崩溃是怎么回事 - ?
答永复肾: 电池老了,应该是手机时间长了
孟连傣族拉祜族佤族自治县18563322920: 怎么测试自己的app的bug的技巧 - ?
答永复肾: Appium:无需SDK和编译即可测试 一款开源且扩平台的自动化测试工具,适用于测试原生或混合型移动App,支持iOS、Android和FirefoxOS平台.通过它,开发者可以利用测试代码完全访问后端API和数据库.Appium是基于无需SDK和编译...
孟连傣族拉祜族佤族自治县18563322920: ios开发者账号怎么测试app - ?
答永复肾: 1.学ios的话,你必须要用开发工具xcode,这时候你必须要有一个mac,也必须申请ios开发者帐号;如果光看文档那就不用了2.如果要调试程序,那开发工具自带模拟器,不需要信用卡.如果要传到iphone或ipad上,那么必须上传app store,这时候就需要银行卡了.因为要发布你的程序是要付费的.
孟连傣族拉祜族佤族自治县18563322920: 怎么快速测试APP应用的BUG - ?
答永复肾: 一、跨平台开发移动应用测试框架 Appium:无需SDK和编译即可测试 一款开源且扩平台的自动化测试工具,适用于测试原生或混合型移动App,支持iOS、Android和FirefoxOS平台.通过它,开发者可以利用测试代码完全访问后端API和数据库...
孟连傣族拉祜族佤族自治县18563322920: 如何获取IOS上所有安装的app的版本信息 - ?
答永复肾: 可以通过:http.//itunes.apple.com/lookup(问号)id=xxx你的appid(9位数字),返回的是json数据,解析就可以得到版本,你再和当前软件的版本进行比较.如果发现当前版本号大于请求的版本号,就提示更新就可以了.解析的时候保存要跳转的AppStore新版本路径,就是更新需要的路径.点击更新跳转就可以了.把地址用的问号改为符号,就是get请求.
孟连傣族拉祜族佤族自治县18563322920: 怎么测试ios app的内存泄漏 - ?
答永复肾: 方法/步骤1 用xcode打开自己的工程,按快捷键command+r 运行需要测试的程序.2 点击xcode导航栏的“show the debug navigator”,切换到debug模式 然后选中“Memory”,再点击右侧的 “Profile in Instruments”,会自动打开Instruments...