wasm-sourcemap
Eveneko Blogger

背景

我们分析的 Wasm 文件是由 C 语言转换而来的,因此我们需要掌握一个 Wat 文件(Wasm 的文本格式)行号到 C 源码行号的一个映射。一般来讲,这种映射关系都被编译时的 debug info 所保存,例如可以通过使用 emcc [source_file].c -g3 -gsource-map -s WASM=1 -o [target_file].html 命令生成一个 mapping 文件,但是目前这个文件中的 mapping 字段是一些无意义的字符串,或许它就是我们要的映射关系,因此需要搞清楚它的意义。另一个可能的思路是借助一些工具,例如 https://github.com/wasm3/wasm-debug 来提取 Wasm 文件中的 debug 信息,最终获取到映射;

下一步问题是这个分析出来的wasm位置是怎么和wat文件对应起来的,然后你们需要做到我给定一个wasm中指令,你们返回到c语言中

Dwarf in wasm

  • How to WASM DWARF
    • 这个文章讲了wasm和dwarf一起的几个问题。没有函数地址(每个模块是分离的,不是在一个大addrespace里)。浏览器里报告的stacktrace指向module的URL和函数index,和相对模块的offset。Dwarf里面用的是相对code段的字节offset,导致需要转换。
  • The Pain of Debugging WebAssembly
    • 还是这个人的文章。Sourcemap支持稍微好一些,虽然功能完全不够。
  • WebAssembly Debugging
    • 讲了source map的基本用法。它也是从dwarf中生成的。Wasm中增加一个名为sourceMappingURL的module (S-表达式?),指定sourcemap文件的URL。
  • DWARF for WebAssembly
    • for WASM spec
  • Improved WebAssembly debugging in Chrome DevTools
    • 介绍了一些现状。
  • 科普sourcemap v3 proposal
  • BASE64 VLQ CODEC (COder/DECoder) AND SOURCEMAP V3 MAPPINGS PARSER
    • mappings parser
  • JavaScript Source Map 详解
    • version:Source map的版本,目前为3。
    • file:转换后的文件名。
    • sourceRoot:转换前的文件所在的目录。如果与转换前的文件在同一目录,该项为空。
    • sources:转换前的文件。该项是一个数组,表示可能存在多个文件合并。
    • names:转换前的所有变量名和属性名。
    • mappings:记录位置信息的字符串
      • 第一层是行对应,以分号(;)表示,每个分号对应转换后源码的一行。所以,第一个分号前的内容,就对应源码的第一行,以此类推。
      • 第二层是位置对应,以逗号(,)表示,每个逗号对应转换后源码的一个位置。所以,第一个逗号前的内容,就对应该行源码的第一个位置,以此类推。
      • 第三层是位置转换,以VLQ编码表示,代表该位置对应的转换前的源码位置。
        • 第一位,表示这个位置在(转换后的代码的)的第几列。
        • 第二位,表示这个位置属于sources属性中的哪一个文件。
        • 第三位,表示这个位置属于转换前代码的第几行。
        • 第四位,表示这个位置属于转换前代码的第几列。
        • 第五位,非必需,表示这个位置属于names属性中的哪一个变量。
        • VLQ编码是变长的。如果(整)数值在-15到+15之间(含两个端点),用一个字符表示;超出这个范围,就需要用多个字符表示。它规定,每个字符使用6个两进制位,正好可以借用Base 64编码的字符表。

wasm-sourcemap.py生成sourcemap

Emscripten带了一个工具叫 wasm-sourcemap.py 原理是dwarf dump出来,先找debug_line,然后找DW_AT_stmt_list, DW_AT_comp_dir。它自己生成sourcemap就是通过这个工具生成的。注意不能使用-g3。

PDF

  • Post title:wasm-sourcemap
  • Post author:Eveneko
  • Create time:2021-09-08 16:15:56
  • Post link:https://eveneko.com/2021/09/08/wasm-sourcemap/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments