iOS渲染偶现crash

Creator 2.4.2
iOS:所有版本
崩溃日志如下:

0 GLEngine _gleRunVertexSubmitARM + 2976
1 GLEngine _gleRunVertexSubmitARM.match
2 GLEngine _gleSetVertexArrayFunc + 144
3 GLEngine _glDrawElements_ACC_ES2Exec + 1144
4 XMDisney cocos2d::renderer::DeviceGraphics::draw(unsigned long, int) (DeviceGraphics.cpp:0)
5 XMDisney cocos2d::renderer::BaseRenderer::draw(cocos2d::renderer::BaseRenderer::StageItem const&) (BaseRenderer.cpp:369)
6 XMDisney cocos2d::renderer::ForwardRenderer::drawItems(std::__1::vector<cocos2d::renderer::BaseRenderer::StageItem, std::__1::allocatorcocos2d::renderer::BaseRenderer::StageItem > const&) (ForwardRenderer.cpp:294)
7 XMDisney cocos2d::renderer::BaseRenderer::render(cocos2d::renderer::View const&, cocos2d::renderer::Scene const*) (BaseRenderer.cpp:190)
8 XMDisney cocos2d::renderer::ForwardRenderer::render(cocos2d::renderer::Scene*, float) (ForwardRenderer.cpp:106)
9 XMDisney cocos2d::renderer::RenderFlow::render(cocos2d::renderer::NodeProxy*, float, cocos2d::renderer::Camera*) (functional:1831)
10 XMDisney js_renderer_RenderFlow_renderRegistry (jsb_renderer_auto.cpp:0)
11 JavaScriptCore long long JSC::APICallbackFunction::callJSC::JSCallbackFunction(JSC::ExecState*) + 456
12 JavaScriptCore JSC::LLInt::setUpCall(JSC::ExecState*, JSC::Instruction*, JSC::CodeSpecializationKind, JSC::JSValue, JSC::LLIntCallLinkInfo*) + 456
13 JavaScriptCore _llint_entry + 26392
14 JavaScriptCore _llint_entry + 26308
15 JavaScriptCore _llint_entry + 26308
16 JavaScriptCore _llint_entry + 26308
17 JavaScriptCore _llint_entry + 26308
18 JavaScriptCore void WTF::dataLog<char [36], JSC::PropertyName, char [30]>(char const (&) [36], JSC::PropertyName const&, char const (&) [30]) + 436
19 JavaScriptCore JSC::JITCode::execute(JSC::VM*, JSC::ProtoCallFrame*) + 164
20 JavaScriptCore JSC::Interpreter::executeCall(JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 416
21 JavaScriptCore JSC::profiledCall(JSC::ExecState*, JSC::ProfilingReason, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 164
22 JavaScriptCore JSObjectCallAsFunction + 636
23 XMDisney se::Object::call(std::__1::vector<se::Value, std::__1::allocatorse::Value > const&, se::Object*, se::Value*) (Object.mm:533)
24 XMDisney cocos2d::EventDispatcher::dispatchTickEvent(float) (vector:555)
25 XMDisney -[MainLoop doCaller:] (CCApplication-ios.mm:208)
26 QuartzCore CA::Display::DisplayLinkItem::dispatch(unsigned long long) + 44
27 QuartzCore CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 436
28 IOKit IODispatchCalloutFromCFMessage + 372
29 CoreFoundation ___CFMachPortPerform + 180
30 CoreFoundation _CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 56
31 CoreFoundation ___CFRunLoopDoSource1 + 436
32 CoreFoundation ___CFRunLoopRun + 1752
33 CoreFoundation CFRunLoopRunSpecific + 424
34 GraphicsServices GSEventRunModal + 100
35 UIKit UIApplicationMain + 208
36 XMDisney main (main.m:13)
37 libdyld.dylib _start + 4

偶现,无法稳定复现,有没有大侠也遇到过?

内存泄漏了,野指针了

有没有参考排查方案 :grinning:

应该跟这个问题有关系,可以自己合并下PR
https://github.com/cocos-creator/cocos2d-x-lite/pull/2884

还有像这样的,出现次数更多,线上共计上报4400多次了 :joy:

0 XMDisney ABAudioSenderPortIsMuted + 2933332
1 XMDisney ABAudioSenderPortIsMuted + 2933312
2 XMDisney ABAudioSenderPortIsMuted + 3749080
3 XMDisney ABAudioSenderPortIsMuted + 2684792
4 QuartzCore CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 636
5 IOKit IODispatchCalloutFromCFMessage + 488
6 CoreFoundation ___CFMachPortPerform + 188
7 CoreFoundation _CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 56
8 CoreFoundation ___CFRunLoopDoSource1 + 440
9 CoreFoundation ___CFRunLoopRun + 2096
10 CoreFoundation CFRunLoopRunSpecific + 436
11 GraphicsServices GSEventRunModal + 104
12 UIKitCore UIApplicationMain + 212
13 XMDisney 0x0000000100bac000 + 16440
14 libdyld.dylib _start + 4

合了PR,还是会出现

  • 0 GLEngine 0x0000000196bf398c _gleRunVertexSubmitARM + 2976
  • 1 GLEngine 0x0000000196bf096c _gleSetVertexArrayFunc + 144
  • 2 GLEngine 0x0000000196b98204 _glDrawElements_ACC_ES2Exec + 836
  • 3 0x0000000101c79fa8 __ZN7cocos2d8renderer14DeviceGraphics4drawEmi + 544
  • 4 0x0000000101b68df8 __ZN7cocos2d8renderer12BaseRenderer4drawERKNS1_9StageItemE + 1036
  • 5 0x0000000101cea180 __ZN7cocos2d8renderer15ForwardRenderer9drawItemsERKNSt3__16vectorINS0_12BaseRenderer9StageItemENS2_9allocatorIS5_EEEE + 280
  • 6 0x0000000101b68528 __ZN7cocos2d8renderer12BaseRenderer6renderERKNS0_4ViewEPKNS0_5SceneE + 884
  • 7 0x0000000101ce9420 __ZN7cocos2d8renderer15ForwardRenderer6renderEPNS0_5SceneE + 228
  • 8 0x0000000101dcd51c __ZN7cocos2d8renderer10RenderFlow6renderEPNS0_9NodeProxyEf + 396
  • 9 0x0000000101d49f04 __Z37js_renderer_RenderFlow_renderRegistryRKN2v820FunctionCallbackInfoINS_5ValueEEE + 240
  • 10 0x0000000101e45d28 __ZN2v88internal25FunctionCallbackArguments4CallENS0_15CallHandlerInfoE + 624
  • 11 0x0000000101e45318 __ZN2v88internal12_GLOBAL__N_119HandleApiCallHelperILb0EEENS0_11MaybeHandleINS0_6ObjectEEEPNS0_7IsolateENS0_6HandleINS0_10HeapObjectEEESA_NS8_INS0_20FunctionTemplateInfoEEENS8_IS4_EENS0_16BuiltinArgumentsE + 612
  • 12 0x0000000101e44a74 __ZN2v88internalL26Builtin_Impl_HandleApiCallENS0_16BuiltinArgumentsEPNS0_7IsolateE + 276

楼上出现的问题很可能是 IndexBuffer 里 glBufferData() 创建 buffer 对象失败,然后后面在 DeviceGraphics 里又试图调用 glDrawElements() 绘制这个 buffer 对象导致 SIGSEGV 。

提了个 PR :https://github.com/cocos-creator/engine-native/pull/3285 当检测到 glBufferData() 失败时,避免调用 glDrawElements() ,规避 crash 。

这个 PR 确实能够修复一些赢更新 buffer 带来的崩溃。不过对于每帧都更新 buffer 的情况来说,也会导致性能的开销,毕竟 glGetError 会导致 gl 状态的同步,是个比较耗性能的操作。我觉得比较好的方式是在 debug 开启检查,在发布前就修复掉类似的问题,毕竟 buffer 数据的更新也是自己控制的。

此问题很难复现,大概产生的原因是什么呢?修复有什么建议呢?跟v8、jsc有关系吗?为减小包体积我们iOS一直用jsc。crash应该都是引擎问题导致的吧?理论上不管上层js怎么写,引擎native层都不应该crash

从错误来看是内存出错了,比如楼上说的 buffer 数据更新超出了范围,或者是 buffer 可能都没有生成成功。和 v8/jsc 没有关系。

理论上来说是这样的。不过引擎还没有做到这个稳定性。

的确 glGetError() 不建议在 release 版本中调用。所以这个规避方式比较猥琐。
真的要解决楼上那个 crash 的话,还得继续挖掘类似空数组(https://github.com/cocos-creator/cocos2d-x-lite/pull/2884 )引发的其他 bad case ,但这个复现路径会比较难确认。
在这之前,这个 PR 可能更适合愿意牺牲一点性能降低crash率的民间团队采纳。

1赞

你这个问题应该和 Cocos 无关,是 AudioBus 的 crash 。检查下你们的工程代码吧。

是Cocos导致的,就是runloop循环过程中的crash,只是bugly搜集的堆栈是这样,不好具体定位。

FYI,会不会跟多线程安全有关?AudioBus 能不能加锁控制下?

AudioEngine 频繁play/stop会crash,合并过这个PR解决了,可能其它地方也有类似并发问题
https://github.com/cocos2d/cocos2d-x/pull/18865

嗯嗯,这个可能没有合并到 creator 底层。我们会合并一下。

你说到并发问题指的是?如果是多线程的话是会有问题的。

2.4.3 restart ios 崩溃 大佬可以看看这个吗? 这个崩溃必现没有人看

2.4.3 restart ios 崩溃 大佬可以看看这个吗? 这个崩溃必现没有人看11