Emscripten与mappedGlobals.find(名称)崩溃!= mappedGlobals.end()

问题描述 投票:0回答:3

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

_setjmpTable
Assertion failed: mappedGlobals.find(name) != mappedGlobals.end() ? true : (std::cerr << name.str << '\n', false), file C:\emslave\buildslave\win-tagbuilder\emsdk\binaryen\tag-1.38.29\src\asm2wasm.h, line 1659
shared:ERROR: 'C:/workspace/emsdk/clang/e1.38.29_64bit/binaryen\bin\asm2wasm 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问题here中提到了这个问题

问题是因为

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

正如Emscripten的作者所说

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

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

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

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

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

c++ emscripten
3个回答
1
投票

当我使用emscripten_wget(...)-s ASYNCIFY=1时,我有同样的问题。我不得不使用emscripten_async_wget,它不需要ASYNCIFY。

附:我使用emscripten版本1.38.29。


0
投票

根据this,ASYNCIFY是一个已知的bug

在例外和setjmp之类的东西上有一些已知的ASYNCIFY错误。 emterpreter尚未在这些功能上进行过测试,因此目前还不清楚它是否可行。更新:当堆栈上存在try-catch(llvm调用)时,执行和异步操作存在已知问题。

使用EMTERPRETIFY而不是ASYNCIFY

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

代替


0
投票

当我用WASM = 0禁用webassembly时 它也可以正常工作

© www.soinside.com 2019 - 2024. All rights reserved.