Mozilla 最近展示了如何使用像GDB和LLDB这样的标准调试器在浏览器之外调试WebAssembly二进制文件。在与生产环境相同的执行环境中调试 WebAssembly 代码,使开发人员可以捕获并诊断相同代码在本地构建时可能不会出现的 Bug。
WebAssembly 加上WASI使得在浏览器之外使用WebAssembly取得了长足的进步,并兑现了“编写一次,到处运行”的承诺。
虽然已经可以在浏览器之外运行 WebAssembly 程序了,特别是在wasmtime中,但调试过程还存在一些困难。虽然 WASI 允许开发人员使用控制台日志报告程序执行情况,但源代码无法调试。以编译成 WebAssembly 的Rust源代码为例,rustwasm 文档解释了这个问题:
调试器目前提供的实用工具有限,最终我们将单步调试编译器输出的原始 WebAssembly 指令,而不是我们编写的 Rust 源代码文本。
现在可以使用GDB和LLDB等传统工具对.wasm 文件进行源码级调试了。
在最近发布的一段截屏视频中,Mozilla 演示了使用 LLDB 调试一个由 Rust 生成的 WebAssembly 程序,该程序实现了FizzBuzz问题的解决方案。这段视频首先展示了使用 cargo 将 Rust 代码编译成到 WebAssembly,并使用 wasmtime 运行生成的 wasm 代码。接下来,该视频使用 LLDB 调试信息来检测 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 运行时的教程中提供了如何使用C和Rust开发 WASI 应用的示例。生成的.wasm 模块可以在任何兼容 WASI 的运行时中运行,比如 Wasmtime 或Fastly的Lucet。
原文链接:
WebAssembly Source Code Can Now Be Debugged Outside the Browser With GDB and LLDB
评论