Отладка¶
Прежде чем писать ещё много кода, стоит иметь под рукой средства отладки на случай ошибок. Ознакомьтесь со справочной страницей: инструменты и подходы к отладке WebAssembly, сгенерированного из Rust.
Логирование паник¶
При панике в коде в консоли разработчика должны появляться понятные сообщения об ошибке.
В wasm-pack-template по умолчанию подключена опциональная зависимость крейт console_error_panic_hook, настройка — в wasm-game-of-life/src/utils.rs. Достаточно установить хук в функции инициализации или на общем пути выполнения. Например, вызвать его в конструкторе Universe::new в wasm-game-of-life/src/lib.rs:
1 2 3 4 5 | |
Добавляем логирование в «Игру жизни»¶
Через console.log из крейта web-sys можно добавить логирование по каждой ячейке в функции Universe::tick.
Сначала добавьте web-sys в зависимости и включите фичу "console" в wasm-game-of-life/Cargo.toml:
1 2 3 4 5 6 7 8 9 | |
Для удобства обернём console.log в макрос в духе println!:
1 2 3 4 5 6 7 8 | |
Дальше в коде на Rust можно вставлять вызовы log! и писать в консоль. Например, чтобы логировать состояние ячейки, число живых соседей и следующее состояние, измените wasm-game-of-life/src/lib.rs так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | |
Отладчик с паузой между каждым тиком¶
Например, можно останавливаться на каждой итерации renderLoop, поставив инструкцию JavaScript debugger; перед вызовом universe.tick().
1 2 3 4 5 6 7 8 9 | |
Так удобно проверять записи в лог и сравнивать текущий кадр с предыдущим.
Упражнения¶
-
Добавьте в
tickлогирование строки и столбца каждой ячейки, у которой состояние перешло из «жива» в «мёртва» или наоборот. -
Вставьте
panic!()в методUniverse::new. Посмотрите трейс паники в JavaScript-отладчике браузера. Отключите отладочные символы, пересоберите без опциональной зависимостиconsole_error_panic_hookи снова посмотрите стек. Без хука картина заметно хуже, не так ли?
