记一次iOS中有关UnityGfxDeviceWorker异常

前言

事情是这个样子的。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:      104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Triggered by Thread:  26

Application Specific Information:
abort() called

Thread 0 name:  Dispatch queue: com.apple.main-thread


Thread 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真是个好社区,在文章找到了出现过相关情况的国外大佬(点击即可进入):

上面链接原文适合有英文阅读能力或者自带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

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值