除錯由 Rust 產生的 WebAssembly

本節包含除錯由 Rust 產生的 WebAssembly 的提示。

使用除錯符號建置

⚡ 在除錯時,務必使用除錯符號建置!

如果您未啟用除錯符號,那麼 "name" 客製區段將不會出現在已編譯的 .wasm 二進位檔中,而堆疊追蹤將顯示類似 wasm-function[42] 的函數名稱,而非函數的 Rust 名稱,例如 wasm_game_of_life::Universe::live_neighbor_count

使用 "debug" 建置(即 wasm-pack build --debugcargo build)時,會預設啟用除錯符號。

使用 "release" 建置時,不會預設啟用除錯符號。若要啟用除錯符號,請確保在 Cargo.toml[profile.release] 區段中 debug = true

[profile.release]
debug = true

透過 console API 記錄

記錄是我們用來驗證和推翻關於程式碼錯誤假設最有效的方法之一。在網路上,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時也擷取並顯示堆疊追蹤和其他記錄的訊息。

參考資料

紀錄驚恐

console_error_panic_hook板條箱透過console.error記錄意料之外的驚恐至開發者主控台。比獲得一則難以理解、難以偵錯的RuntimeError: unreachable executed錯誤訊息更好,它會提供Rust格式化的驚恐訊息。

你所需要做的只是在初始化函數或常見程式碼路徑中呼叫console_error_panic_hook::set_once()來安裝掛鉤


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

使用偵錯器

不幸地,WebAssembly的偵錯故事仍未成熟。在大多數Unix系統上,DWARF 用於編碼偵錯器需要提供執行中程式的原始碼等級檢查的資訊。在Windows上有編碼類似資訊的另一種格式。目前,WebAssembly沒有等效的格式。因此,偵錯器目前提供有限的實用工具,我們最終逐步瞭解編譯器放射的原始WebAssembly指令,而不是我們編寫的Rust原始碼文字。

W3C WebAssembly團體針對偵錯小章程,因此預期這個故事未來會變好!

儘管如此,偵錯器仍然對於檢查與我們的WebAssembly互動的JavaScript以及檢查原始wasm狀態很有用。

參考資料

首先避免需要偵錯WebAssembly

如果錯誤特定於與JavaScript或Web API的互動,那麼wasm-bindgen-test編寫測試。

如果錯誤涉及 JavaScript 或 Web API 互動,請嘗試將其複製為一般的 Rust #[test] 函式,以便在除錯時提升作業系統的成熟原生工具。請使用測試程式庫,例如 quickcheck 及其測試案例收縮器,以機械化方式減少測試案例。最終,如果你能將錯誤分離在不須與 JavaScript 互動的較小測試案例中,你將能夠更輕易地找出並修復這些錯誤。

請注意,若要執行原生的 #[test],而不產生編譯器和連結器的錯誤,你必須確保在 Cargo.toml 檔案的 [lib.crate-type] 陣列中包含 "rlib"

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