Webkit WASM堆栈跟踪调试

时间:2017-05-18 12:19:49

标签: javascript webassembly

目前,当发生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 )是什么意思,特别是那些数字?

3 个答案:

答案 0 :(得分:4)

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

(<WASM>[function_index]+offset)

要查找函数索引的相应名称,您可以使用生成函数索引的binaryen&#39; 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函数调用。此函数可能导致&#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],其中spamname一个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