1

当前,当发生 webassembly 运行时错误时,stacktrace 如下所示(我正在尝试将 Csound 作为 webassembly 运行)

"RuntimeError: integer result unrepresentable
at  (<WASM>[5336]+20)
at  (<WASM>[1557]+246)
at  (<WASM>[408]+1475)
at  (<WASM>[6101]+14)
at Object.Module.dynCall_ii (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:9614:89)
at invoke_ii (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:8882:32)
at  (<WASM>[424]+732)
at  (<WASM>[278]+45)
at Module._CsoundObj_performKsmps (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:9606:128)
at ScriptProcessorNode.audioProcessNode.onaudioprocess (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/CsoundObj.js:272:19)"

(<WASM>[ number1 ]+ number2 ) 是什么意思,尤其是那些数字?

4

3 回答 3

4

经过一番研究,我发现格式是

(<WASM>[function_index]+offset)

要查找函数索引的相应名称,您可以使用 binaryen 的wasm-as -s选项生成函数索引

wasm-as libcsound.wast -s libcsound.sym -o libcsound.wasm

这是 libcs​​ound.sym 的内容

0:Math_pow
1:enlargeMemory
2:getTotalMemory
3:abortOnCannotGrowMemory
...

使用 libcs​​ound.sym 我们可以使用 WASM 函数名称来增强示例

RuntimeError: integer result unrepresentable
    at  (<WASM>[5336]+20) _lrintf
    at  (<WASM>[1557]+246) _osckk
    at  (<WASM>[408]+1475) _kperf_nodebug
    at  (<WASM>[6101]+14) dynCall_ii
    at Object.Module.dynCall_ii (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:9614:89)
    at invoke_ii (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:8882:32)
    at  (<WASM>[424]+732) _csoundPerformKsmps
    at  (<WASM>[278]+45) jsCall_vi
    at Module._CsoundObj_performKsmps (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:9606:128)
    at ScriptProcessorNode.audioProcessNode.onaudioprocess (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/CsoundObj.js:272:19)

有趣的部分是对lrintf的最后一个 C 函数调用。当要转换的浮点数超出长整数范围时,此函数会导致“整数结果不可表示”陷阱。在调用修复问题的 lrint 之前,我先编辑了 C 代码以检查边界。

更新

使用-g4和使用 Google Chrome 版本 60.0.3103.0 (Official Build) canary (64-bit) 函数名称出现在堆栈跟踪中:

Uncaught RuntimeError: integer result unrepresentable
    at _lrintf (<WASM>[4176]+6)
    at _osckk (<WASM>[1291]+138)
    at _kperf_nodebug (<WASM>[257]+768)
    at dynCall_ii (<WASM>[4351]+13)
    at Object.Module.dynCall_ii (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:9153:89)
    at invoke_ii (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:8714:32)
    at _csoundPerformKsmps (<WASM>[271]+558)
    at _CsoundObj_performKsmps (<WASM>[131]+33)
    at Module._CsoundObj_performKsmps (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/libcsound.js:9145:128)
    at ScriptProcessorNode.audioProcessNode.onaudioprocess (http://192.168.2.39/~manson/emscripten/csound/emscripten/examples/javascripts/CsoundObj.js:269:19)
于 2017-05-18T15:46:31.377 回答
2

第一个数字是来自 WebAssemblyCode部分的函数索引。第二个是该函数中生成陷阱的偏移量,以字节为单位(WebAssembly 中的一些指令会生成陷阱,这会变成 JavaScript 异常)。要将函数编号映射回来,您可以使用wabt提供的工具(可从wasm-stat.us获得预构建版本,请参阅生成 URL 的“归档二进制文件”步骤,例如https://storage.googleapis.com/wasm-llvm/builds/mac/5128/wasm-binaries-5128.tbz2)。

您还可以在调试模式下使用 emscripten 来生成Namesection。然后每个函数索引将映射到一个名称,该名称将显示在回溯中。

您将使用命令行,例如:

em++ ./awesome.cc -O2 -g4 -s WASM=1 -o awesome.js -s EXPORTED_FUNCTIONS="['amazing']"

-g4是添加部分的name部分。不要用这个发送代码!

在 Mac 上,如果您更新到较新的Safari 技术预览版,您将获得诸如 之类的条目"wasm function: 4@[wasm code],或者如果您启用了调试功能,例如C 函数的名称wasm function: _spam@[wasm code]在哪里。spam此更改是最近才发生的,需要 STP 30 或更高版本。其他浏览器做类似的事情。在所有情况下,它们还需要一个相当新的工具链,因为该name部分的格式已经改变。


您得到的错误是因为float转换int具有无法准确表示的浮点值。这会在 WebAssembly 中陷入陷阱,而不是在大多数其他 C++ 实现中产生未指定的值。

最近,在 WebAssembly 和(我认为?)binaryen 的 LLVM 实现中出现了一些错误,其中一些通常可以推测的操作被提升到过去的检查中。该错误很可能存在于您正在运行的代码中,但工具链可能会无条件地进行该转换,从而导致代码陷入陷阱。更新工具链可能会消除该错误。

于 2017-05-18T15:45:38.050 回答
0

解决“整数结果不可表示”问题的一种方法是使用此选项:

-s "BINARYEN_TRAP_MODE='clamp'"

或者可能

-s "BINARYEN_TRAP_MODE='js'"

https://github.com/kripken/emscripten/wiki/WebAssembly#trap-mode

于 2018-01-02T23:07:37.690 回答