IOS启动闪退,Escape value set twice

  • Creator 版本:V2.2.0

  • 目标平台: IOS

  • 详细报错信息,包含调用堆栈:
    `
    JS: BaseSDK::onRequestProductList ,jsonObj = {“currencyCode”:“CNY”,“productList”:[{“extra”:"",“price”:1,“productId”:“com.blingame.jump.consume_1”},{“extra”:"",“price”:12,“productId”:“com.blingame.jump.consume_2”},{“extra”:"",“price”:60,“productId”:“com.blingame.jump.consume_3”},{“extra”:"",“price”:348,“productId”:“com.blingame.jump.consume_4”},{“extra”:"",“price”:618,“productId”:“com.blingame.jump.consume_5”},{“extra”:"",“price”:18,“productId”:“com.blingame.jump.consume_6”}],“symbol”:“¥”,“type”:21}
    JS: BaseSDK::onRequestProductList , key:key_1 price:1
    JS: BaseSDK::onRequestProductList , key:key_2 price:12
    JS: BaseSDK::onRequestProductList , key:key_3 price:60

Fatal error in , line 0

unreachable code

#FailureMessage Object: 0x16b5933e8
==== C stack trace ===============================
JS: BaseSDK::onRequestProductList , key:key_4 price:348
JS: BaseSDK::onRequestProductList , key:key_5 price:618
JS: BaseSDK::onRequestProductList , key:key_6 price:18
JS: [WARN]: IOSSDK::window.onSDKAPI,old sonStr End = {“currencyCode”:“CNY”,“productList”:[{“extra”:"",“price”:1,“productId”:“com.blingame.jump.consume_1”},{“extra”:"",“price”:12,“productId”:“com.blingame.jump.consume_2”},{“extra”:"",“price”:60,“productId”:“com.blingame.jump.consume_3”},{“extra”:"",“price”:348,“productId”:“com.blingame.jump.consume_4”},{“extra”:"",“price”:618,“productId”:“com.blingame.jump.consume_5”},{“extra”:"",“price”:18,“productId”:“com.blingame.jump.consume_6”}],“symbol”:“¥”,“type”:21}

Fatal error in EscapableHandleScope::Escape

Escape value set twice

0   Jump-mobile                         0x000000010505f3c4 v8::base::debug::StackTrace::StackTrace() + 24
1   Jump-mobile                         0x0000000105061f9c v8::platform::(anonymous namespace)::PrintStackTrace() + 24
2   Jump-mobile                         0x000000010505b8b0 V8_Fatal(char const*, int, char const*, ...) + 208
3   Jump-mobile                         0x000000010531fc64 v8::internal::JSObject::GetHeaderSize(v8::internal::InstanceType, bool) + 316
4   Jump-mobile                         0x0000000105315d68 v8::internal::JSArrayBuffer::Setup(v8::internal::Handle<v8::internal::JSArrayBuffer>, v8::internal::Isolate*, bool, void*, unsigned long, v8::internal::SharedFlag, bool) + 104
5   Jump-mobile                         0x0000000105315f2c v8::internal::JSArrayBuffer::SetupAllocatingData(v8::internal::Handle<v8::internal::JSArrayBuffer>, v8::internal::Isolate*, unsigned long, bool, v8::internal::SharedFlag) + 172
6   Jump-mobile                         0x0000000105082a10 v8::ArrayBuffer::New(v8::Isolate*, unsigned long) + 140
7   Jump-mobile                         0x0000000104f506bc se::Object::createTypedArray(se::Object::TypedArrayType, void*, unsigned long) + 204
8   Jump-mobile                         0x0000000104d79450 Data_to_seval(cocos2d::Data const&, se::Value*) + 148
9   Jump-mobile                         0x0000000104c5b918 _ZZL58js_CanvasRenderingContext2D_setCanvasBufferUpdatedCallbackRN2se5StateEENK3$_1clERKN7cocos2d4DataE + 132
10  Jump-mobile                         0x0000000104c5b888 _ZNSt3__1L8__invokeIRZL58js_CanvasRenderingContext2D_setCanvasBufferUpdatedCallbackRN2se5StateEE3$_1JRKN7cocos2d4DataEEEEDTclclsr3std3__1E7forwardIT_Efp_Espclsr3std3__1E7forwardIT0_Efp0_EEEOSA_DpOSB_ + 64
11  Jump-mobile                         0x0000000104c5b818 _ZNSt3__128__invoke_void_return_wrapperIvE6__callIJRZL58js_CanvasRenderingContext2D_setCanvasBufferUpdatedCallbackRN2se5StateEE3$_1RKN7cocos2d4DataEEEEvDpOT_ + 64
12  Jump-mobile                         0x0000000104c5b7b8 _ZNSt3__110__function12__alloc_funcIZL58js_CanvasRenderingContext2D_setCanvasBufferUpdatedCallbackRN2se5StateEE3$_1NS_9allocatorIS5_EEFvRKN7cocos2d4DataEEEclESB_ + 64
13  Jump-mobile                         0x0000000104c5a058 _ZNSt3__110__function6__funcIZL58js_CanvasRenderingContext2D_setCanvasBufferUpdatedCallbackRN2se5StateEE3$_1NS_9allocatorIS5_EEFvRKN7cocos2d4DataEEEclESB_ + 64
14  Jump-mobile                         0x0000000104ee8370 std::__1::__function::__value_func<void (cocos2d::Data const&)>::operator()(cocos2d::Data const&) const + 88
15  Jump-mobile                         0x0000000104ee50f8 std::__1::function<void (cocos2d::Data const&)>::operator()(cocos2d::Data const&) const + 60
16  Jump-mobile                         0x0000000104ee5444 cocos2d::CanvasRenderingContext2D::fillText(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, float, float, float) + 320
17  Jump-mobile                         0x0000000104bce1f0 js_engine_CanvasRenderingContext2D_fillText(se::State&) + 736
18  Jump-mobile                         0x0000000104bcddd8 js_engine_CanvasRenderingContext2D_fillTextRegistry(v8::FunctionCallbackInfo<v8::Value> const&) + 364
19  Jump-mobile                         0x00000001050ca510 v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) + 624
20  Jump-mobile                         0x00000001050c9b00 v8::internal::MaybeHandle<v8::internal::Object> v8::internal::(anonymous namespace)::HandleApiCallHelper<false>(v8::internal::Isolate*, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::HeapObject>, v8::internal::Handle<v8::internal::FunctionTemplateInfo>, v8::internal::Handle<v8::internal::Object>, v8::internal::BuiltinArguments) + 612
21  Jump-mobile                         0x00000001050c925c v8::internal::Builtin_Impl_HandleApiCall(v8::internal::BuiltinArguments, v8::internal::Isolate*) + 276
22  Jump-mobile                         0x00000001058985ec Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit + 108
23  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
24  Jump-mobile                         0x00000001057fef44 Builtins_ArgumentsAdaptorTrampoline + 228
25  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
26  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
27  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
28  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
29  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
30  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
31  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
32  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
33  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
34  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
35  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
36  Jump-mobile                         0x000000010583fd6c Builtins_StoreIC + 876
37  Jump-mobile                         0x00000001058e49b8 Builtins_StaNamedPropertyHandler + 152
38  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
39  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
40  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
41  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
42  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
43  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
44  Jump-mobile                         0x00000001058068a4 Builtins_InterpreterEntryTrampoline + 804
45  Jump-mobile                         0x0000000105803c24 Builtins_JSEntryTrampoline + 164
46  Jump-mobile                         0x00000001058038cc Builtins_JSEntry + 172
47  ???                                 0x00000001087cc000 0x0 + 4437360640

(lldb)
`

  • 重现方式:

打包到苹果手机,第一次启动闪退,查看日志如上
第二次打开却正常了,不知道是什么原因

  • 出现概率:必先

  • 额外线索:
    查了论坛,最接近的是这个

creator2.2.2打包到iOS平台,模拟器正常,真机闪退问题

是不是调用了evalString ? JS 接口函数调用前最好定义下 se::AutoHandleScope hs;

恩恩对的
`

  • (void)sendCocos:(NSMutableDictionary *)dict{

    NSString *jsonString = [SDKUtils toJSONString:dict];
    NSLog(@“Xcode::sendCocos===========jsonString = %@”,jsonString);

    //TODO: 替换特殊符号 {“type”:1} —> {#type#:1}
    jsonString = [jsonString stringByReplacingOccurrencesOfString:@""" withString:@"#"];
    // OC -> js
    std::string strRet = std::string([jsonString UTF8String]) ;
    std::string jsCallStr = cocos2d::StringUtils::format(“onSDKAPI(”%s");", strRet.c_str());
    se::Value *ret = new se::Value();
    se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str() , -1 , ret);

    NSLog(@“XCode ,json = %@”,jsonString);

}
`
这个【se::AutoHandleScope】 怎么加?

定义在函数最前面

不知道是不是我写法有问题,
se::Value *ret = new se::Value(); se::AutoHandleScope hs; se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str() , -1 , ret);

报另外一个错
class AutoHandleScope { public: AutoHandleScope() : _handleScope(v8::Isolate::GetCurrent()) // 这里报错了 { } ~AutoHandleScope() { }

放到 sendCocos 方法,也是一样的报错
`

  • (void)sendCocos:(NSMutableDictionary *)dict{
    se::AutoHandleScope hs;

    }
    `

不行就给个demo吧,我们这边复现不出你说的情况

测试了很多遍,终于找到原因了!!!!!
我发现每次闪退的时候,都是卡在了IOS 请求商品信息完成后的回调(也就这里会导致闪退)
所以在调用 evalString 前,增加开启异步dispatch_async
修改代码如下:
`
// 请求商品信息后,通知Cocos
// [IOSInterface sendCocos:Type_RequestProductList:jsonDict];

// 开启异步,否则会闪退
dispatch_async(dispatch_get_main_queue(), ^{
[IOSInterface sendCocos:Type_RequestProductList:jsonDict];
});
`

初步猜测,商品信息request请求,卡主线程了,
..... SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdSet]; request.delegate = self; [request start];
但很奇怪的是,使用了很久的代码,以前也没出现这个问题 =。=

1赞

我这边的解决方案,也是用异步,不知道引擎团队的大佬们,解决了没有

本身回调不是在主线程吧?evalString 必须在主线程才能调用,引擎设计就是这样的,所以你们的处理是必须,而且就是只能你们自己处理。