热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

记一次iOS中有关UnityGfxDeviceWorker异常

前言事情是这个样子的。12月17号那天发行方说提审的ios游戏包在苹果部分机型和系统上大概率闪退,一听这消息我彻底慌了,身为ios菜鸟小白࿰
前言

事情是这个样子的。12月17号那天发行方说提审的ios游戏包在苹果部分机型和系统上大概率闪退,一听这消息我彻底慌了,身为ios菜鸟+小白,我是谁我该怎么办这是当时最真实的想法。好的程序员应该学会怎么解决问题。看闪退日志,找了一些国内外的资料。终于凭自己的实践在没经过别人帮助下解决此问题。记录一下帮助遇到同样问题的同学。
大狗子.gif

问题描述

开发设备:

  • Xcode 12.3

  • Unity Mac18.4.13c1 破解版本

我手里测试机有三款分别是

  • iPad Pro : 系统:13.7

  • iPhoneX : 系统:14.2

  • iPhone6s : 系统:14.2

当时调试sdk用的是iPad Pro : 系统:13.7,测试的时候什么问题都没有。根据发行方所描述的问题集中在14.2系统上,于是用另外两款设备测试,的确复现了发行方所描述的问题。

但是有一个很奇怪的事情。在闪退中发现了2个问题。闪退1的问题 2个机型都会存在 在初始化完成后必闪退。 闪退问题2 在测试同一个点(卡牌类游戏十连抽完成)的时候iPhone6s 大概率闪退,iPhoneX 小概率闪退。

产生的异常EXC_CRASH(SIGABRT)

错误栈日志部分信息:

Hardware Model: iPhone10,3
Code Type: ARM-64 (Native)
Role: Foreground
Parent Process: launchd [1]Date/Time: 2020-12-17 18:58:28.8882 +0800
Launch Time: 2020-12-17 18:48:08.2783 +0800
OS Version: iPhone OS 14.2
Release Type: User
Baseband Version: 2.02.04
Report Version: 104Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 26Application Specific Information:
abort() calledThread 0 name: Dispatch queue: com.apple.main-threadThread 26 name: UnityGfxDeviceWorker Dispatch queue: compiler request queue
Thread 26 Crashed:
0 libsystem_kernel.dylib 0x00000001b2757414 0x1b272f000 + 164884
1 libsystem_pthread.dylib 0x00000001cec6fb40 0x1cec6d000 + 11072
2 libsystem_c.dylib 0x000000018eb7cb74 0x18eb06000 + 486260
3 libsystem_malloc.dylib 0x0000000194c0249c 0x194be4000 + 124060
4 libsystem_malloc.dylib 0x0000000194c02740 0x194be4000 + 124736
5 libsystem_malloc.dylib 0x0000000194c01f9c 0x194be4000 + 122780
6 libsystem_malloc.dylib 0x0000000194bfd310 0x194be4000 + 103184
7 libsystem_malloc.dylib 0x0000000194bfdff4 0x194be4000 + 106484
8 libsystem_malloc.dylib 0x0000000194bff5e8 0x194be4000 + 112104
9 libdispatch.dylib 0x000000018547bf30 0x185449000 + 208688
10 Metal 0x000000019b528d30 0x19b4dc000 + 314672
11 Metal 0x000000019b5272ac 0x19b4dc000 + 307884
12 Metal 0x000000019b526ee8 0x19b4dc000 + 306920
13 Metal 0x000000019b527b38 0x19b4dc000 + 310072
14 libdispatch.dylib 0x000000018544cdb0 0x185449000 + 15792
15 libdispatch.dylib 0x000000018545b428 0x185449000 + 74792
16 Metal 0x000000019b527a88 0x19b4dc000 + 309896
17 Metal 0x000000019b5288e4 0x19b4dc000 + 313572
18 Metal 0x000000019b551488 0x19b4dc000 + 480392
19 Metal 0x000000019b551e9c 0x19b4dc000 + 482972
20 Metal 0x000000019b55361c 0x19b4dc000 + 488988
21 Metal 0x000000019b51f91c 0x19b4dc000 + 276764
22 AGXMetalA13 0x00000001d0195960 0x1cfeee000 + 2783584
23 项目名称 0x0000000100d957d8 0x10051c000 + 8886232
24 项目名称 0x0000000100d95280 0x10051c000 + 8884864
25 项目名称 0x0000000100d951a4 0x10051c000 + 8884644
26 项目名称 0x0000000100d95ea8 0x10051c000 + 8887976
27 项目名称 0x0000000100b7a414 0x10051c000 + 6677524
28 项目名称 0x000000010092a9c8 0x10051c000 + 4254152
29 项目名称 0x0000000100942468 0x10051c000 + 4351080
30 项目名称 0x0000000100d8c840 0x10051c000 + 8849472
31 项目名称 0x0000000100944fe8 0x10051c000 + 4362216
32 项目名称 0x000000010093d778 0x10051c000 + 4331384
33 项目名称 0x0000000100b4eb3c 0x10051c000 + 6499132
34 libsystem_pthread.dylib 0x00000001cec6eb40 0x1cec6d000 + 6976
35 libsystem_pthread.dylib 0x00000001cec77768 0x1cec6d000 + 42856

Exception Type: EXC_CRASH (SIGABRT) //异常类型Exception Code: 0x0000000000000000, 0x0000000000000000 //异常编码地址Exception Note: EXC_CORPSE_NOTIFY //异常原因描述Triggered by Thread: 26 //异常发生的线程(0为主线程,其他为子线程,我们可以看到发生异常为子线程 26出现了异常)

EXC_CRASH是一个异常,基本上意味着该应用程序以异常方式终止。SIGABRT是EXC_CRASH异常的最常见原因。这意味着代码中存在未处理的异常,或者代码中的某处正在调用abort()。

这是一个相当直接的调试崩溃。解决此问题的最佳方法就是获取崩溃的堆栈跟踪信息,并确保已对它进行了符号化标记,以能够正确查明未处理的异常。

异常问题一

Exception.png

这段是我用xcode复现捕获的异常,断点只能定位到UnityGfxDeviceWorker (34): signal SIGABRT,而且只在iOS14系统下才会闪退。13的完全没事。

后经过查阅资料和测试复现才发现这个问题,Product Name包含了非法字符。Product Name为〜项目中文名たちもののけ〜崩溃,修改后只保留中文字符 测试完全没有问题。重新给发行方出了一个新包。但是问题接踵而至。

Product Name.png

异常问题二

Product Name改为全部中文后,测试loading 界面闪退问题解决了。但是问题依旧还是有,游戏主场景的10连抽,直接闪退机型iPhone6s :系统14.2。查看日志还是UnityGfxDeviceWorker (26): signal SIGABRT。没办法了只能请教google大佬了。

查阅了国外的资料发现stack overflow真是个好社区,在文章找到了出现过相关情况的国外大佬(点击即可进入):

  • Unity crash on OS X: UnityGfxDeviceWorker thread crashed

  • gfx device intialization failed and crash on iOS since Unity 5.5.0f03

上面链接原文适合有英文阅读能力或者自带Google翻译软件的同学,说的很清楚。这里我直接说下解决办法。方法是关闭Unity自动图形API并删除Metal,仅保留OpenGLES2(这是较早的gfx API)。这样一来,Unity问题就解决了。

如下截图是没修改前的设置,图中设置都是默认的。也是导致闪退问题的元凶。

setting.png

下图是修改后没问题的设置,在Build Settings里找到 Other Settings,设置 Auto Graphics api不勾选,默认是Metal。OpenGLES2是没有的,右边有个+的符号选择OpenGLES2,然后删除掉Metal只保留OpenGLES2。测试了手里的三个机型闪退点不存在了,问题就这样解决了。

image.png

: 如果你使用Unity 2020.1.9f1导出Xcode工程,Xcode中可以取消选中Edit Scheme-> Run-> Diagnostics中的Metal API Validation标志来解决该问题。

Metal API Validation.png

结尾

简单做下复盘,争取以后遇到这样的问题,一看就能把同样的错误搞定。如果本文对你有帮助,留下你的三连(点赞评论+关注)

放个恶犬咬你们.gif


推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • PeopleSoft安装镜像版本及导入语言包的方法
    本文介绍了PeopleSoft安装镜像的两个版本,分别是VirtualBox虚拟机版本和NativeOS版本,并详细说明了导入语言包的方法。对于Windows版本,可以通过psdmt.exe登录进入,并使用datamover脚本导入语言包。对于Linux版本,同样可以使用命令行方式执行datamover脚本导入语言包。导入语言包后,可以实现多种语言的登录。参考文献提供了相关链接以供深入了解。 ... [详细]
  • 51nod3221祝寿(反向建图优化)
    题目链接感觉忘记了好多东西。求有向图中其余点到一个点的最短距离可以将该图翻转后rundijkstra#include#include ... [详细]
  • 1.webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用(1) ... [详细]
  • 我一直都有记录信息的习惯,不知是从什么时候开始,大约是在工作后不久。如今还真有点庆幸从那时开始记了点东西,当然是电子版的,写 ... [详细]
  • 交换机配置:intg100unshintvlani1ipadd192.168.56.177qstelseuser-iv4authaaaproinsshupl3qsshuserpyt ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
author-avatar
achih
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有