位置: 编程技术 - 正文

手游频繁崩溃”闪退”? 从程序上找原因(手游频繁崩溃怎么解决)

编辑:rootadmin
手游频繁崩溃”闪退”? 从程序上找原因 作为玩家,当游戏crash的时候是什么心情,如果这个游戏玩起来还不错的话,那我可能还会打开第二次,如果这个游戏一般的话我可能直接怒删了。当多次出现闪退crash的时候,这种糟糕的体验很容易让用户流失,造成很大的损失。但是作为测试人员,面对如此棘手的事情,首先要做的是协助开发组解决问题。没错,第一件要做的事情就是去定位crash发生的代码逻辑,到底是哪个文件的哪一段函数逻辑导致了这个crash问题。因此,我们需要去尽量重现crash场景,收集解析crash日志,以此定位到具体到游戏代码逻辑中寻找导致crash的原因,改善项目的质量和体验。本文阐述在App crash产生的原理,收集和解析过程,旨在经验积累,与大家分享。  一.crash产生的原因  当iOS/Android设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上。crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈跟踪信息和内存映像,这样就能够通过解析这些信息进而定位crash发生时的代码逻辑,从而找到App闪退的原因。通常来说,crash产生来源于两种问题:违反iOS系统规则导致的crash和App代码逻辑BUG导致的crash,下面分别对他们进行分析。  1.1违反iOS系统规则包括三种类型:  (1) 内存报警闪退  当iOS检测到内存过低时,它的VM系统会发出低内存警告通知,尝试回收一些内存;如果情况没有得到足够的改善,iOS会终止后台应用以回收更多内存;最后,如果内存还是不足,那么正在运行的应用可能会被终止掉。在Debug模式下,可以主动将客户端执行的动作逻辑写入一个log文件中,这样程序童鞋可以将内存预警的逻辑写入该log文件,当发生如下截图中的内存报警时,就是提醒当前客户端性能内存吃紧,可以通过Instruments工具中的Allocations 和 Leaks模块库来发现内存分配问题和内存泄漏问题。

推荐整理分享手游频繁崩溃”闪退”? 从程序上找原因(手游频繁崩溃怎么解决),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:手游频繁崩溃怎么回事,手游一直闪退什么原因,手游频繁崩溃怎么回事,手游频繁崩溃怎么解决,手游频繁崩溃怎么解决,手游频繁崩溃怎么回事,手游频繁崩溃怎么回事,手游频繁崩溃怎么办,内容如对您有帮助,希望把文章链接给更多的朋友!

  (2) 响应超时  当应用程序对一些特定的事件(比如启动、挂起、恢复、结束)响应不及时,苹果的Watchdog机制会把应用程序干掉,并生成一份相应的crash日志。这些事件与下列UIApplicationDelegate方法相对应,当遇到Watchdog日志时,可以检查上图中的几个方法是否有比较重的阻塞UI的动作。  application:didFinishLaunchingWithOptions:  applicationWillResignActive:  applicationDidEnterBackground:  applicationWillEnterForeground:  applicationDidBecomeActive:  applicationWillTerminate:  (3) 用户强制退出  一看到“用户强制退出”,首先可能想到的双击Home键,然后关闭应用程序。不过这种场景一般是不会产生crash日志的,因为双击Home键后,所有的应用程序都处于后台状态,而iOS随时都有可能关闭后台进程,当应用阻塞界面并停止响应时这种场景才会产生crash日志。  这里指的“用户强制退出”场景,是稍微比较复杂点的操作:先按住电源键,直到出现“滑动关机”的界面时,再按住Home键,这时候当前应用程序会被终止掉,并且产生一份相应事件的crash日志。  1.2应用逻辑的Bug  大多数闪退崩溃日志的产生都是因为应用中的Bug,这种Bug的错误种类有很多,比如  SEGV:(Segmentation Violation,段违例),无效内存地址,比如空指针,未初始化指针,栈溢出等;  SIGABRT:收到Abort信号,可能自身调用abort()或者收到外部发送过来的信号;  SIGBUS:总线错误。与SIGSEGV不同的是,SIGSEGV访问的是无效地址(比如虚存映射不到物理内存),而SIGBUS访问的是有效地址,但总线访问异常(比如地址对齐问题);  SIGILL:尝试执行非法的指令,可能不被识别或者没有权限;  SIGFPE:Floating Point Error,数学计算相关问题(可能不限于浮点计算),比如除零操作;  SIGPIPE:管道另一端没有进程接手数据;  常见的崩溃原因基本都是代码逻辑问题或资源问题,比如数组越界,访问野指针或者美术资源不存在,或美术资源大小写错误等,这种问题的类型有很多,不再详细介绍。  二.crash的收集  上文提到crash日志是操作系统层产生并保存在设备上的,那如果我的一台设备在运行某App的时候crash了,可以通过什么方式拿到crash日志呢。如果是在windows上你可以通过itools或pp助手等辅助工具查看系统产生的历史crash日志,然后再根据app来查看。如果是在Mac 系统上,只需要打开xcode->windows->organizer->devices,选择device logs进行查看,如下图,这些crash文件都可以导出来,然后再单独对这个crash文件做处理分析。

  以上这些是针对能够拿到真机设备的情况下才能收集crash日志的。如果是针对玩家的话,当App在玩家的设备上crash的时候如何收集呢。先来看下市场上已有的商业软件提供crash收集服务,他们这些软件基本都提供了日志存储,日志符号化解析和服务端可视化管理等服务:  Crashlytics (www.crashlytics.com)  Crittercism (www.crittercism.com)  Bugsense (www.bugsense.com)  TestFlight (www.testflightapp.com)  HockeyApp (www.hockeyapp.net)  Flurry(www.flurry.com)  具体这些商业软件有哪些优缺点,有人做了如下统计:手游频繁崩溃”闪退”? 从程序上找原因(手游频繁崩溃怎么解决)

  除了上述所说的这些商业软件外,还有一些开源的软件也可以拿来收集crash日志,比如Razor,QuincyKit(git链接)等,这些软件收集crash的原理其实大同小异,都是根据系统产生的crash日志进行了一次提取或封装,然后将封装后的crash文件上传到对应的服务端进行解析处理。很多商业软件都采用了Plcrashreporter这个开源工具来上传和解析crash,比如HockeyApp,Flurry和crittercism等,下图是笔者利用这一开源框架制作的一个收集crash的样例。

  通过这种方式就可以很好的支持开发人员收集crash日志的需求,进而定位和解决App产品存在的问题。如果有需要或者感兴趣的可以深入的调研一下。  但是有个很重要的问题就是这种方式只能收集游戏引擎层(c&#;&#;或object c代码)的逻辑,如果是脚本逻辑问题产生的crash就无能无力了。而现在手游项目基本都是引擎(cocos2dx或Neox)&#;脚本(lua或javascript)的开发模式,几乎所有的业务逻辑都在脚本层,游戏App时常发生的crash几乎都是由脚本逻辑bug导致的,这该怎么处理呢?平时在开发阶段,程序童鞋在Debug模式下开通了客户端运行日志功能,当出现crash或者traceback等问题的时候直接去查看log文件的输出即可知道原因了,但是在Release模式下一切log输出均被屏蔽,逻辑运行的log消息输出也就无法查看了。这种情况该又该如何处理呢?方法总比问题多,iOS/Android系统提供了异常发生时的处理API,只需要在程序启动的地方加入对应的处理逻辑,当异常发生时就可以触发对应的回调函数将必要的信息进行处理上传,适时地反馈给开发组。比如,下图是某项目组在iOS平台收集crash的一个截图:

  其实,它具体的实现原理是这样的:首先,在游戏应用程序启动的地方需要开启异常处理逻辑的handler:

  最后需要当crash发生时,需要调用的回调函数处理具体如下:

  这样在当玩家在Release游戏版本中出现逻辑异常导致crash时,就会把对应的脚本层的异常(traceback或error等)以类&#;dump文件的形式发送到指定的服务端,方便运营维护人员进行快速定位分析。这些脚本层异常日志收集后的显示效果如下:  以具体某一个异常日志文件为例,具体上传的内容如下图。这是一种直接可读的文本,里面记录着crash发生时代码逻辑的traceback,通过阅读代码逻辑就可以直接定位到或推断导致crash

  

标签: 手游频繁崩溃怎么解决

本文链接地址:https://www.jiuchutong.com/biancheng/372809.html 转载请保留说明!

上一篇:uGUI实现遥感(unet遥感图像分割)

下一篇:一款已上市MMO手游地图同步方案总结(及将上市的手机)

  • 劳务公司怎么交税,都有哪些税
  • 所得税可以弥补几年
  • 国税地税合并是成功的还是失败的
  • 视同销售收入是纳税调整项目吗
  • 计提本月短期借款利息是权责发生制吗
  • 财政拨款收入年底结转到本期盈余
  • 购入免征车船税吗
  • 发生销售折让可以不开具
  • 债权重组会计分录大全
  • 进项税转出的附加税怎么做
  • 什么情况下发票不能冲红
  • 补交增值税如何入账
  • 这个月没有进项开了发票可怎么办
  • 辅导期一般纳税人预缴增值税
  • 公司的企业所得税和个人所得税
  • 案例讲解:当年度未及时取得有效凭证的相关成本、费用涉税处理
  • 雇员个人所得税
  • 六大减税措施内容
  • 分支机构享受了税收优惠,是由总机构备案还是分支机构备案?
  • 发票没用完可以领发票吗
  • 小规模所得税表格模板
  • 小规模企业国税怎么报税
  • Realtek高清晰音频管理器设置方法
  • 转让金融商品应交增值税计算公式
  • 腾讯电脑管家帮忙卸载
  • 电子税务局变更办税人员怎么操作
  • php的file函数
  • 个税手续费会计分录
  • launcher process
  • 债务重组 收益
  • 滞纳金不得超过税款
  • 出售解除监管协议书
  • 房开企业增值税扣除土地价款包括契税吗
  • 未分配现付是什么意思
  • php是面向对象编程吗
  • php字符串定义
  • 一维频率分布表
  • 《设计模式》
  • vuea
  • nodejs hook
  • thinkphp 分页
  • mybatis怎么用
  • java sc
  • 净营业周期为负数
  • 应税销售额税率
  • 哪些收入需缴纳增值税
  • 个体工商户如何用工
  • PostgreSQL教程(十七):客户端命令(1)
  • 填写企业所得税年度纳税申报表都需要哪些数据
  • 盈余公积包括哪两个明细科目
  • 投资性房地产公允价值模式账务处理
  • 车船税手续费返还时间
  • 收了对方预付款怎么打条
  • 当月开的票当月可以勾选抵扣吗
  • 老板借给公司钱需要交税吗
  • 发票有什么重要性
  • 应交税费借方如何计算
  • 空气检测费计入什么科目
  • 连接mysql服务命令
  • 迅速修复系统漏洞的方法
  • ubuntu crontab
  • 富士通FUJITSU笔记本电脑开机进入BIOS的方法(F2)
  • 如何快速查询身份证号码
  • 计算机策略设置
  • windows8.1开机
  • redhat linux 7.2系统安装详细过程
  • cocos2d在运行java eclipse程序时出现 Error: could not open c:program FilesJavajre6libamd64jvm.cfg
  • shader cull
  • Cocos2dx3.2 Crazy Tetris 基本设置及主菜单页面(菜单、按钮)
  • angular重新渲染组件
  • 分享js粘帖屏幕怎么弄
  • pythoni脚本
  • 在javascript中什么方法可以对数组元素进行排序
  • javascript核心技术开发解密
  • androidstudio离线配置环境
  • 老司机指的是
  • css中position的用法
  • 痛点 堵点 难点 盲点
  • 文化事业建设费减免政策
  • 广西定额发票查询入口官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设