调试 Rust-生成的 WebAssembly

本节包含,调试 Rust 生成的 WebAssembly 的提示.

带调试符号的构建

⚡ 调试时,请务必确保,是使用调试符号构建的!

如果您没有调试符号,那么自定义"name"部分不会出现在,已编译.wasm二进制中,还有堆栈跟踪的是像wasm-function[42]这样的函数名称,而不是函数的 Rust 名称,如wasm_game_of_life::Universe::live_neighbor_count

使用”调试”版本时(又称wasm-pack build --debugcargo build),当然默认情况下启用调试符号。

使用”release”构建时,默认情况下不启用调试符号。要启用调试符号,请确保您在Cargo.toml[profile.release]部分下,具有debug = true:

[profile.release]
debug = true

使用 console APIs 记录

记录是我们用来证明和反驳我们的程序错误原因的最有效工具之一。在网上,console.log 函数是将消息记录到,浏览器的开发人员工具控制台的方法。

我们可以用web-sys可获得console记录函数的访问权限:


# #![allow(unused_variables)]
#fn main() {
extern crate web_sys;

web_sys::console::log_1(&"Hello, world!".into());
#}

或者,console.error 函数console.log具有相同的函数签名,不同的是,console.error开发人员工具更倾向于在记录消息的同时,捕获并显示堆栈跟踪。

参考

记录 Panics

console_error_panic_hookcrate 将意外的恐慌,记录到开发者控制台console.error,不再是神秘,难以调试RuntimeError: unreachable executed错误消息,给你 Rust 的格式化恐慌消息。

您需要做的就是,在初始化函数或公共代码路径中,通过调用console_error_panic_hook::set_once()来安装钩子:


# #![allow(unused_variables)]
#fn main() {
#[wasm_bindgen]
pub fn init() {
    console_error_panic_hook::set_once();
}
#}

使用一个 调试器

不幸的是,WebAssembly 的调试’故事’仍然不成熟。在大多数 Unix 系统上,DWARF是用来编码信息的,信息是调试器提供正运行程序的源级检查的。在 Windows 上有一种替代格式,具有类似的编码信息。目前,没有属于 WebAssembly 的等价物。因此,调试器目前提供有限的实用程序,我们最终逐步执行编译器发出的原始 WebAssembly 指令,而不是我们编写的 Rust 源文本。

有一个用于调试的 W3C WebAssembly 组的子章节,所以期待这个’故事’在未来有所改善!

尽管如此,调试器仍然可用于检查与 WebAssembly 交互的 JavaScript,以及检查原始状态.

参考

首先避免调试 Webassembly

如果该错误来自与 JavaScript 或 Web API 的交互,那么先wasm-bindgen-test写测试吧。

如果bug ,涉及与 JavaScript 或 Web API 的交互,那尝试将其重现为正常的 Rust#[test]函数,您可以在调试时,利用操作系统的成熟本机工具。使用测试箱quickcheck和它的测试案例 shrinkers 呆板地减少测试用例。最终,如果您可以在不需要与 JavaScript 交互的较小测试用例中隔离它们,您将更容易找到,并修复错误。

请注意,为了没有编译器和链接器错误情况下,良好运行本机#[test],您需要确保这"rlib"[lib.crate-type]数组内,Cargo.toml文件如下:

[lib]
crate-type ["cdylib", "rlib"]