现在可以借助 GDB 和 LLDB 在浏览器外调试 WebAssembly 源代码了

Mozilla 最近展示了如何使用像 GDBLLDB 这样的标准调试器在浏览器之外调试 WebAssembly 二进制文件。在与生产环境相同的执行环境中调试 WebAssembly 代码,使开发人员可以捕获并诊断相同代码在本地构建时可能不会出现的 Bug。

WebAssembly 加上 WASI 使得 在浏览器之外使用 WebAssembly 取得了长足的进步,并兑现了“编写一次,到处运行”的承诺。

虽然已经可以在浏览器之外运行 WebAssembly 程序了,特别是在 wasmtime 中,但调试过程还存在一些困难。虽然 WASI 允许开发人员使用 控制台日志 报告程序执行情况,但源代码无法调试。以编译成WebAssembly 的 Rust 源代码为例,rustwasm 文档解释了这个问题:

调试器目前提供的实用工具有限,最终我们将单步调试编译器输出的原始 WebAssembly 指令,而不是我们编写的 Rust 源代码文本。

现在可以使用 GDBLLDB 等传统工具对.wasm 文件进行源码级调试了。

在最近发布的一段 截屏视频 中,Mozilla 演示了使用LLDB 调试一个由Rust 生成的WebAssembly 程序,该程序实现了 FizzBuzz 问题的解决方案。这段视频首先展示了使用 cargo 将 Rust 代码编译成到 WebAssembly,并使用 wasmtime 运行生成的 wasm 代码。接下来,该视频使用 LLDB 调试信息来检测 wasm 代码:

复制代码

lldb -- wasmtime -g target/wasm32-wasi/debug/fizz.wasm

这一步操作完成后,开发人员可以使用断点(例如 breakpoint set -name fizzbuzz)、源码级导航、在程序中断执行期间检查和修改变量、查看和浏览堆栈帧(stack frames),以及使用命令行界面或 LLDB 的图形用户界面执行其他典型的调试功能:

Mozilla 解释了源码级调试如何帮助 WebAssembly 开发人员捕获原本容易混淆的 Bug:

Wasmtime 的调试使开发人员更容易捕获和诊断相同代码在本地构建时可能不会出现的 Bug。例如,与传统的 Unix 风格的权限相比, WebAssembly 系统接口 (WASI)对待文件系统的访问更严格。这可能会导致只有在 WebAssembly 运行时中才会显现的问题。

LLVM 项目 是模块、可重用的编译器和工具链技术的集合。LLDB 项目以 LLVM 提供的库为基础构建,并提供了一个本地调试器。

GDB(GNU 项目调试器)是一个调试器,它支持以下语言:C++、Rust、Go、Objective-C、Ada、Assembly、C、D、Fortran、OpenCL、Modula-2 和 Pascal。

WASI (WebAssembly 系统接口)是一个正走在 标准化道路 上的、面向 WebAssembly 的模块化系统接口,它 注重安全性和可移植性 。WASI 旨在使开发人员能够在任何设备、计算机或操作系统上运行 WebAssembly 程序。

Wasmtime 是一个独立的 JIT 风格的 WebAssembly 运行时。Wasmtime 运行时的 教程 中提供了如何使用 CRust 开发 WASI 应用的 示例 。生成的.wasm 模块可以在任何兼容WASI 的运行时中运行,比如Wasmtime 或 Fastly 的 Lucet

原文链接:

WebAssembly Source Code Can Now Be Debugged Outside the Browser With GDB and LLDB