首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Webkit WASM堆栈跟踪调试

Webkit WASM堆栈跟踪调试
EN

Stack Overflow用户
提问于 2017-05-18 12:19:48
回答 3查看 2K关注 0票数 1

当前,当出现一个when运行时错误时,堆栈跟踪看起来如下所示(我正在尝试以when的形式运行when)

代码语言:javascript
复制
"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)"

(number1+number2)是什么意思,特别是那些数字?

EN

回答 3

Stack Overflow用户

发布于 2017-05-18 15:46:31

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

代码语言:javascript
复制
(<WASM>[function_index]+offset)

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

代码语言:javascript
复制
wasm-as libcsound.wast -s libcsound.sym -o libcsound.wasm

这是libcsound.sym的内容

代码语言:javascript
复制
0:Math_pow
1:enlargeMemory
2:getTotalMemory
3:abortOnCannotGrowMemory
...

使用libcsound.sym,我们可以增强WASM函数名的示例

代码语言:javascript
复制
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)

有趣的部分是对林特的最后C函数调用。当要转换的浮点数位于长整数范围之外时,此函数会导致“整数结果不可表示”陷阱。我编辑了C代码,以便在调用lrint之前先检查边界,这解决了问题。

更新

当使用-g4和使用GoogleChromeVersion60.0.3103.0(正式构建)金丝雀(64位)函数名出现在堆栈跟踪中:

代码语言:javascript
复制
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)
票数 4
EN

Stack Overflow用户

发布于 2017-05-18 15:45:38

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

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

您可以使用命令行,例如:

代码语言:javascript
复制
em++ ./awesome.cc -O2 -g4 -s WASM=1 -o awesome.js -s EXPORTED_FUNCTIONS="['amazing']"

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

在Mac上,如果更新到较新的Safari技术预览,就会得到诸如"wasm function: 4@[wasm code]之类的条目,或者如果您已经启用了类似于wasm function: _spam@[wasm code]之类的项,那么spam就是C函数的名称。此更改为最近,需要STP 30或更近期的STP。其他浏览器也会做类似的事情。在所有情况下,它们都需要一个相当新的工具链,因为name部分的格式已经改变了。

您所得到的错误是因为floatint的转换有一个浮点值,不能准确地表示。这会在WebAssembly中产生陷阱,而不是在大多数其他C++实现中产生一个未指定的值。

最近在WebAssembly的LLVM实现中出现了一些bug,并且(我认为呢?)在一些通常可以进行推测的操作中,有一些是通过检查悬挂的。错误很可能已经出现在您正在运行的代码中,但是工具链不附加条件的转换很可能会导致代码陷入陷阱。更新工具链可能会删除错误。

票数 2
EN

Stack Overflow用户

发布于 2018-01-02 23:07:37

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

代码语言:javascript
复制
-s "BINARYEN_TRAP_MODE='clamp'"

或者有可能

代码语言:javascript
复制
-s "BINARYEN_TRAP_MODE='js'"

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44047603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档