除錯由 Rust 產生的 WebAssembly
本節包含除錯由 Rust 產生的 WebAssembly 的提示。
使用除錯符號建置
⚡ 在除錯時,務必使用除錯符號建置!
如果您未啟用除錯符號,那麼 "name"
客製區段將不會出現在已編譯的 .wasm
二進位檔中,而堆疊追蹤將顯示類似 wasm-function[42]
的函數名稱,而非函數的 Rust 名稱,例如 wasm_game_of_life::Universe::live_neighbor_count
。
使用 "debug"
建置(即 wasm-pack build --debug
或 cargo 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
時也擷取並顯示堆疊追蹤和其他記錄的訊息。
參考資料
- 用
web-sys
板條箱使用console.log
- 用
web-sys
板條箱使用console.error
- MDN上的
console
物件 - Firefox開發者工具 - 網路主控台
- Microsoft Edge開發者工具 - 主控台
- 開始使用Chrome DevTools主控台
紀錄驚恐
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"]