Ulepszone debugowanie WebAssembly w Narzędziach deweloperskich w Chrome

Ingvar Stepanyan
Ingvar Stepanyan

Tło

Do niedawna możliwe było tylko debugowanie WebAssembly obsługiwane przez Narzędzia deweloperskie w Chrome nieprzetworzone zrzuty stosu WebAssembly i przechodzenie poszczególnych instrukcji zdezasemblowanego formatu tekstowego WebAssembly.

Zrzut ekranu przedstawiający wcześniej ograniczone wsparcie dla debugowania WebAssembly w Narzędziach deweloperskich w Chrome

Ta metoda działa z dowolnym modułem WebAssembly i w pewnym stopniu pomaga w debugowaniu małych, izolowanych funkcji, ale nie jest zbyt praktyczna w przypadku większych aplikacji, w których mapowanie między dezasembelowanym kodem a kodem źródłowym jest mniej oczywiste.

Tymczasowe obejście

Aby rozwiązać ten problem, Emscripten i Narzędzia deweloperskie tymczasowo dostosowują map źródłowych do WebAssembly. Ta dozwolona mapowanie między przesunięciami binarnymi w skompilowanym module do oryginalnych lokalizacji w plikach źródłowych.

Zrzut ekranu przedstawiający debugowanie z wykorzystaniem map źródłowych.

Mapy źródłowe są jednak zaprojektowane pod kątem formatów tekstowych z wyraźnym mapowaniem koncepcji i wartości JavaScript, a nie w przypadku formatów binarnych, takich jak WebAssembly, z dowolnymi językami źródłowymi, systemami typów i pamięcią liniową. Z tego powodu integracja była ograniczona i nie była obsługiwana poza Emscriptenem.

Wpisz DWARF

Z drugiej strony wiele języków natywnych ma już wspólny format debugowania, DWARF, który zawiera wszystkie informacje potrzebne debugerom do identyfikowania lokalizacji, nazw zmiennych, układów tekstowych i innych elementów.

Chociaż nadal trzeba dodać kilka funkcji WebAssembly, aby zapewnić pełną zgodność, kompilatory takie jak Clang i Rust obsługują już emitowanie informacji DWARF w modułach WebAssembly, co umożliwiło zespołowi DevTools rozpoczęcie korzystania z nich bezpośrednio w DevTools.

W pierwszym kroku DevTools obsługuje mapowanie natywnego źródła za pomocą tych informacji, dzięki czemu możesz rozpocząć debugowanie modułów Wasm wygenerowanych przez dowolny z tych kompilatorów bez konieczności korzystania z rozmontowanego formatu ani skryptów niestandardowych.

Zamiast tego musisz poinformować kompilatora, aby dołączył dane debugowania w taki sam sposób jak na innych platformach. Na przykład w językach Clang i Emscripten można to zrobić, przekazując flagę -g podczas kompilacji:

  clang -g …sources… -target wasm32 -o out.wasm

  emcc -g …sources… -o out.js

W Rust możesz użyć tej samej flagi -g:

  rustc -g source.rs --target wasm32-unknown-unknown -o out.wasm

Jeśli używasz Cargo, dane debugowania będą domyślnie uwzględnione:

  cargo build --target wasm32-unknown-unknown

Ta nowa integracja Narzędzi deweloperskich z DWARF obejmuje już obsługę wykonywania kroków w kodzie, ustawiania punktów przerwania i rozpoznawania zrzutów stosu w językach źródłowych.

Zrzut ekranu pokazujący nowe debugowanie za pomocą DWARF

Przyszłość

Przed Tobą jeszcze sporo pracy. Na przykład jeśli chodzi o narzędzia, atrybuty Emscripten (Binaryen) i wasm-pack (wasm-bindgen) nie obsługują aktualizacji informacji DWARF o przekształcaniu, które jeszcze trwają. Na razie nie będą one z niej korzystać.

Jeśli chodzi o Narzędzia deweloperskie w Chrome, będziemy stopniowo rozwijać integrację, aby zapewnić bezproblemowe debugowanie, w tym:

  • Rozpoznawanie nazw zmiennych
  • Rodzaje druku estetycznego
  • Ocenianie wyrażeń w języku źródłowym
  • …i wiele innych.

Wkrótce podamy więcej informacji.

Pobierz kanały podglądu

Rozważ użycie przeglądarki Chrome Canary, Dev lub Beta jako domyślnej przeglądarki dla programistów. Te kanały podglądu dają Ci dostęp do najnowszych funkcji Narzędzi deweloperskich, umożliwiają testowanie najnowocześniejszych interfejsów API platformy internetowej i wykrywanie problemów w witrynie, zanim zrobią to użytkownicy.

Kontakt z zespołem Narzędzi deweloperskich w Chrome

Skorzystaj z poniższych opcji, aby porozmawiać o nowych funkcjach i zmianach w poście lub o innych kwestiach związanych z Narzędziami deweloperskimi.