目前,当发生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)"
(&lt; WASM&gt; [ number1 ] + number2 )是什么意思,特别是那些数字?
答案 0 :(得分:4)
经过一番研究,我发现格式是
(<WASM>[function_index]+offset)
要查找函数索引的相应名称,您可以使用生成函数索引的binaryen&#39; wasm-as
-s
选项
wasm-as libcsound.wast -s libcsound.sym -o libcsound.wasm
这是libcsound.sym
的内容0:Math_pow
1:enlargeMemory
2:getTotalMemory
3:abortOnCannotGrowMemory
...
使用libcsound.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函数调用。此函数可能导致&#34;整数结果无法代表&#34;当要转换的浮点数位于长整数范围之外时陷阱。我在编写lrint之前编辑了C代码以检查边界,从而修复了问题。
<强>更新强>
使用-g4
并使用Google Chrome版本60.0.3103.0(官方构建)时,金丝雀(64位)函数名称会出现在堆栈跟踪中:
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)
答案 1 :(得分:2)
第一个数字是WebAssembly Code
section的函数索引。第二个是该函数中的偏移量(以字节为单位),其中生成陷阱(WebAssembly中的某些指令生成陷阱,这些陷阱变为JavaScript异常)。要将功能编号映射回来,您可以使用wabt提供的工具(预编译版本可从wasm-stat.us获得),请参阅“存档二进制文件”步骤,该步骤会生成https://storage.googleapis.com/wasm-llvm/builds/mac/5128/wasm-binaries-5128.tbz2
等网址
您还可以在调试模式下使用emscripten来生成Name
section。然后,每个函数索引将映射到一个名称,该名称将显示在回溯中。
您可以使用命令行,例如:
em++ ./awesome.cc -O2 -g4 -s WASM=1 -o awesome.js -s EXPORTED_FUNCTIONS="['amazing']"
-g4
是添加name
部分的部分。不要随身携带代码!
在Mac上,如果您更新为较新的Safari Technology Preview,则会获得"wasm function: 4@[wasm code]
等条目,或者如果您启用了调试功能wasm function: _spam@[wasm code]
,其中spam
是name
一个C函数的名字。此更改为quite recent,最近需要STP 30或更高版本。其他浏览器做类似的事情。在所有情况下,他们还需要一个相当新的工具链,因为float
部分的格式已经改变。
您收到的错误是因为int
到=INDEX($B$1:$E$1,MATCH(1,INDEX(($B2:$E2=LARGE($B2:$E2,COLUMN(A:A)))*(COUNTIF($E2:E2,$B$1:$E$1)=0),),0))
转换的浮点值无法准确表示。这在WebAssembly中陷阱,而不是在C ++的大多数其他实现中产生未指定的值。
最近在WebAssembly的LLVM实现和(我认为?)binaryen中存在一些错误,其中一些通常可以推测的操作在过去的检查中被提升。这个错误很可能出现在你正在运行的代码中,但是工具链很可能无条件地转换导致代码陷阱的转换。更新工具链可能会删除错误。
答案 2 :(得分:0)
修复“整数结果无法代表”问题的一种方法是使用此选项:
-s "BINARYEN_TRAP_MODE='clamp'"
或可能
-s "BINARYEN_TRAP_MODE='js'"
请参阅https://github.com/kripken/emscripten/wiki/WebAssembly#trap-mode