构建多线程WASM模块时的运行时错误排查求助
我们正使用Emscripten构建基于pthreads的模块化WASM应用,当前使用的链接选项如下:
-sWASM=1 -sINITIAL_MEMORY=134217728 -sMAX_WEBGL_VERSION=2 -sUSE_GLFW=3 -sFULL_ES3 -sEXIT_RUNTIME -sASYNCIFY -lembind -sEXPORT_ES6=1 -sUSE_ES6_IMPORT_META=1 -sMODULARIZE=1 -sEXPORT_NAME=FooModule -sENVIRONMENT=web,worker -sUSE_PTHREADS=1 -sPTHREAD_POOL_SIZE=4 -sOFFSCREENCANVAS_SUPPORT=1 -sOFFSCREEN_FRAMEBUFFER -pthread -sSHARED_MEMORY
非模块化构建时运行正常,但开启模块化后出现JS端运行时错误,核心问题为Worker加载失败。检查生成的.js文件后发现两个关键问题:
Worker创建未指定模块类型:
allocateUnusedWorker()创建Worker时未添加type: "module"选项
正确写法应为:new Worker(new URL("FooWEB.worker.js", import.meta.url), { type: "module", })而当前生成的代码是:
new Worker(new URL("FooWEB.worker.js", import.meta.url))Canvas未初始化导致线程创建失败:
Module["canvas"]未定义,Module["PThread"].receiveObjectTransfer(e.data)未被调用,Worker未收到"run"消息,无法执行FooWEB.js中receiveObjectTransfer的Canvas赋值逻辑:Module["canvas"] = GL.offscreenCanvases[data.moduleCanvasId].offscreenCanvas; Module["canvas"].id = data.moduleCanvasId;最终
___pthread_create_js因找不到Module["canvas"]抛出错误:err( 'pthread_create: could not find canvas with ID "' + name + '" to transfer to thread!' );
请问是否遗漏了某些构建配置项?
内容的提问来源于stack exchange,提问作者Michael IV

