iOS 9 GPU崩溃:GPU返回用于硬件启动
我定期收到一个带有iOS 9 GPU崩溃:GPU返回用于硬件启动,ios,opengl-es,Ios,Opengl Es,我定期收到一个带有GPU ReturnGuiltyForHardwareRestart的崩溃。 崩溃是偶发的,发生在一个复杂的多线程应用程序中。下面是堆栈跟踪示例 当用户界面和相关处理程序处于紧张状态时(想想过度活跃的用户会在应用程序和系统允许的情况下尽快做出大量手势),会出现大量的幕后调用和前端渲染,这种情况似乎很少见 研究gpu\u ReturnGuiltyForHardwareRestart表明,这可能是由于缓冲区问题造成的,例如,由于绑定不正确或未能解除绑定而导致缓冲区溢出 (不相关,
GPU ReturnGuiltyForHardwareRestart
的崩溃。
崩溃是偶发的,发生在一个复杂的多线程应用程序中。下面是堆栈跟踪示例
当用户界面和相关处理程序处于紧张状态时(想想过度活跃的用户会在应用程序和系统允许的情况下尽快做出大量手势),会出现大量的幕后调用和前端渲染,这种情况似乎很少见
研究gpu\u ReturnGuiltyForHardwareRestart
表明,这可能是由于缓冲区问题造成的,例如,由于绑定不正确或未能解除绑定而导致缓冲区溢出
(不相关,但我确实看了看:)
我的理解是,缓冲区会以某种方式损坏,而崩溃会在访问损坏的缓冲区后发生
我已经阅读了代码,并确保每个绑定的缓冲区和纹理随后都被解除绑定,以防止以后的代码进行不必要的/无意的更改;还是要撞车
我确实遇到了这些问题,这表明操作系统中可能存在错误:
(所示的原始海报在9 beta 5中固定)
但是,我目前正在9.3.4上进行测试,所以这似乎是可以解决的。我尝试确保所有缓冲区在使用后都正确地解除绑定,并尝试定期使用glFlush()
,但都没有成功
是否有人对此有经验,是否了解潜在的来源、追踪原因的方法或修复方法?
堆栈跟踪:
Date/Time: 2016-08-11T20:20:40Z
Launch Time: 2016-08-11T20:15:22Z
OS Version: iPhone OS 9.3.4 (13G35)
Report Version: 104
Exception Type: SIGSEGV
Exception Codes: SEGV_ACCERR at 0x1
Crashed Thread: 0
Thread 0 Crashed:
0 libGPUSupportMercury.dylib 0x0000000191bd9f28 gpus_ReturnGuiltyForHardwareRestart + 12
1 libGPUSupportMercury.dylib 0x0000000191bdaec4 gpusSubmitDataBuffers + 168
2 GLEngine 0x0000000195e9f1e4 gliPresentViewES_Exec + 172
3 GLEngine 0x0000000195e9f0fc gliPresentViewES + 80
4 OpenGLES 0x000000018576bc44 -[EAGLContext presentRenderbuffer:] + 68
5 NWFPApp 0x00000001001ef8fc -[NWFPIOSGLView renderNormalBuffers] (NWFPIOSGLView.mm:543)
6 NWFPApp 0x00000001001ef814 -[NWFPIOSGLView renderAll] (NWFPIOSGLView.mm:516)
7 NWFPApp 0x00000001001ee780 -[NWFPIOSGLView doInContext:] (NWFPIOSGLView.mm:135)
8 NWFPApp 0x00000001001ef770 -[NWFPIOSGLView drawView] (NWFPIOSGLView.mm:494)
9 NWFPApp 0x0000000100203cc8 -[NWFPGLChoreographer displayLinkEvent:] (NWFPGLChoreographer.m:128)
10 QuartzCore 0x000000018614022c CA::Display::DisplayLinkItem::dispatch() + 36
11 QuartzCore 0x00000001861400e0 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 420
12 IOKit 0x0000000183885e54 IODispatchCalloutFromCFMessage + 368
13 CoreFoundation 0x00000001835ad030 __CFMachPortPerform + 176
14 CoreFoundation 0x00000001835c57d4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
15 CoreFoundation 0x00000001835c4f0c __CFRunLoopDoSource1 + 432
16 CoreFoundation 0x00000001835c2c64 __CFRunLoopRun + 1796
17 CoreFoundation 0x00000001834ecc50 CFRunLoopRunSpecific + 380
18 GraphicsServices 0x0000000184dd4088 GSEventRunModal + 176
19 UIKit 0x00000001887ce088 UIApplicationMain + 200
20 NWFPApp 0x00000001002af1a0 main (main.m:30)
21 ??? 0x000000018308a8b8 0x0 + 0
在大量使用OpenGLES2.0的应用程序中,我们也遇到了类似的问题。最可能的原因是三角形索引点指向超出边界的顶点。实际原因是,着色器代码或驱动程序正在获得一个seg错误,就像它发生在CPU上一样,发生这种情况的唯一变化是引用了错误的内存地址。如果您正在使用VAO,请确保您的VAO在进行抽签呼叫后解除绑定。有时,以前的VAO绑定可能会留下不一致的状态,这也可能导致此问题。