Creator2.3.4版本构建的iOS 含有WebAssembly调用导致进程终止,v2.4.3没问题

  • Creator 版本:2.3.4

  • 目标平台: iOS真机

  • 重现方式:使用2.3.4版本Creator构建含有WebAssembly调用的工程,在真机上调试(6sp iOS13.5.1,xr iOS13.1),触发即崩溃,xcode模拟器没问题

  • 首个报错:

 * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x111288040)
  * frame #0: 0x0000000111288040
    frame #1: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #2: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #3: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #4: 0x000000010393d6c4 WebAssemblyTest-mobile`Builtins_ArgumentsAdaptorTrampoline + 228
    frame #5: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #6: 0x000000010393d6c4 WebAssemblyTest-mobile`Builtins_ArgumentsAdaptorTrampoline + 228
    frame #7: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #8: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #9: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #10: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #11: 0x0000000103945024 WebAssemblyTest-mobile`Builtins_InterpreterEntryTrampoline + 804
    frame #12: 0x00000001039423a4 WebAssemblyTest-mobile`Builtins_JSEntryTrampoline + 164
    frame #13: 0x000000010394204c WebAssemblyTest-mobile`Builtins_JSEntry + 172
  • 之前哪个版本是正常的: 2.4.3
  • 手机型号: 只测试了6SP iOS13.5.1,XR iOS13.1
  • 手机浏览器: Safari
  • 编辑器操作系统: MAC 10.15
  • 重现概率:100%

测试结果:

平台 构建Creator版本 可用
iOS真机 v2.3.4 false
iOS模拟器 v2.3.4 true
Safari v2.3.4 true
Android v2.3.4 true
OPPO小游戏 v2.3.4 true
cocos模拟器 v2.3.4 true
----
iOS真机 v2.4.3 false
iOS模拟器 v2.4.3 false
Safari v2.4.3 true
Android v2.4.3 未测试
OPPO小游戏 v2.4.3 true
cocos模拟器 v2.4.3 true

总结:

通过creator v2.3.4构建的跨平台工程,WASM可以正常运行在iOS模拟器/iOS Safari/Android/OPPO小游戏/CocosCreator模拟器等终端上并输出调用结果,但在iOS真机上运行会导致Xcode抛出异常,直接终止进程,且无法用try捕获;
通过creator v2.4.3构建的跨平台工程,WASM可以正常运行在iOS Safari/OPPO小游戏/CocosCreator模拟器等终端上并输出调用结果;在iOS真机/iOS模拟器上运行,JS抛出异常,报WebAssembly undefined,可以通过try捕获;`

提问

想知道问题出在哪?不支持webAssembly没关系,但不能进程也崩了。没时间升级Creator,所以求一个可以解决问题的简易方案。

demo见附件WebAssemblyTest.zip (226.9 KB)

自顶下,看了一下午的cocos2d-x-lite的pr,没看到相关的合并啊

不是我非要使用WASM,是因为项目用了protobuf 又引用了Long.js,是long.js内部使用到了,而且还做了try,但是一到iOS真机下整个进程就崩了。

搜了下调用栈名,Builtins_InterpreterEntryTrampoline这些都是V8,Creator v2.4.0升级了V8 升级原生平台的 V8 版本到 8.0.426.16,可能在这里有问题?

老哥你这个问题解决了吗?我们这边情况也和你差不多,如果解决了。希望老哥能分享一下。

最后升级到Creator2.4.3了,虽然不支持WASM,但不会崩溃了。低版本的Creator确实不行

如果你原生方面的能力还可以,可以试试去调试下引擎

就是自己能力欠佳,实际上我刚从2dx项目转过来。现在头痛得很

升级Creator呗,实际上也没花太长时间;或者你调用WASM前判断下是iOS-Native,就不调用;

我从OC转Creator也就半年多,哈哈

问题应该可以通过修改protobuf.js解决

protobuf.js内没有用wasm,只是Long.js使用了,protobuf是通过赋值的util使用了Long类,如果你遇到的问题和我是一样的,只需要搜索new WebAssembly,移除掉new的这个实现就好了;
补充下,如果你使用npm或者yarn,记得在每次npm install 或 yarn之后检查下有没有被覆盖
我当时是不想改这些,所以选择升级了Creator;

后来发现主要是解析数据类型出问题,我们这边用int64作为map的key。实际上protobuf把int64转换成了一个包含int32高位和低位的object会报错。现在临时解决了这个,不过可能又在接收byte类型的数据上崩溃了,正在看这个。

我去,byte是不是和这个WebAssembly有关?

我遇到过的关于js int64 protobuf的问题有两个,先说你提到的protobuf的Map,如果定义Proto文件时使用int64作为Map的key,在protobuf.js解析后会被转成hash string,你需要使用import { util } from "protobufjs"; let longkey = util.longFromHash(key);将key转化成long;

我发现我们用的protobuf.js版本应该是4.0的可能和你这个有些不同

上午的时候想到了,回复的时候忘了,我这是 “protobufjs”: “^6.10.1”