Emscripten crash with mappedGlobals.find(name) != mappedGlob

Emscripten crash with mappedGlobals.find(name) != mappedGlobals.end()

本文关键字:mappedGlob name crash with mappedGlobals find Emscripten      更新时间:2023-10-16

当我使用 -s ASYNCIFY=1 编译 Emscripten 代码并调用外部库类时,我遇到了问题。

_setjmpTable
Assertion failed: mappedGlobals.find(name) != mappedGlobals.end() ? true : (std::cerr << name.str << 'n', false), file C:emslavebuildslavewin-tagbuilderemsdkbinaryentag-1.38.29srcasm2wasm.h, line 1659
shared:ERROR: 'C:/workspace/emsdk/clang/e1.38.29_64bit/binaryenbinasm2wasm hello.temp.asm.js --total-memory=16777216 --trap-mode=allow -O3 --mem-init=hello.js.mem --mem-base=1024 --wasm-only -o hello.wasm --mvp-features' failed (-1073740791)

这个问题在emscripten github问题中提到

这里

问题是因为

异步传递将一些代码移出 main,然后它找不到 那些本地变量

正如Emscripten作者所说

当我从外部库 ( .bc ( 调用其他类并使用 ASYNCIFY=1 编译时,就会出现问题。但是,当我删除异步时,一切都很好。

我还发现如果我在之前添加代码

jmp_buf env;
if(!setjmp(env)) 
{
  longjmp(env,1);
  emscripten_sleep(1000);
}

代码可以成功编译,但是当我在浏览器上运行它时它崩溃了

如何解决问题,因为我必须同时使用 ASYNCIFY 和外部库中的类?

当我将emscripten_wget(...)-s ASYNCIFY=1一起使用时,我遇到了同样的问题。我必须改用emscripten_async_wget,它不需要异步。

附言我使用 emscripten 版本 1.38.29。

根据这个,ASYNCIFY是一个已知的错误

ASYNCIFY 在异常和 塞特姆普。Emterpreter尚未在这些功能上进行测试,因此 目前还不清楚它是否有效。更新:存在已知问题 执行和异步操作,当有 try-catch(llvm 调用(时 堆栈。

使用 EMTERPRETIFY 而不是 ASYNCIFY

FLAGS             +=  -s EMTERPRETIFY_FILE="data.binary"
FLAGS             +=  -s EMTERPRETIFY=1
FLAGS             +=  -s EMTERPRETIFY_ASYNC=1

相反

当我使用 WASM=0
禁用网络汇编时它也工作正常