Chrome DevTools의 WebAssembly 디버깅 개선

Ingvar Stepanyan
Ingvar Stepanyan

배경

최근까지 Chrome DevTools가 지원하는 유일한 WebAssembly 디버깅은 원시 WebAssembly 스택 트레이스, 애플리케이션 레이어에서 개별 명령을 단계적으로 디스어셈블된 WebAssembly 텍스트 형식

이전에 Chrome DevTools에서 제한적으로 지원되었던 WebAssembly 디버깅의 스크린샷입니다.

이는 모든 WebAssembly 모듈에서 작동하며 격리된 작은 함수를 디버깅하는 데 다소 도움이 되지만, 분해된 코드와 소스 간의 매핑이 불분명한 대형 앱에서는 그다지 실용적이지 않습니다.

임시 해결 방법

이 문제를 해결하기 위해 Emscripten과 DevTools는 임시로 기존 소스 맵 형식을 WebAssembly로 다운로드합니다. 이렇게 허용된 매핑은 소스 파일의 원래 위치로 컴파일된 모듈을 바이너리 오프셋으로 표시합니다.

소스 맵 기반 디버깅 스크린샷

그러나 소스 맵은 JavaScript 개념 및 값에 대한 명확한 매핑이 있는 텍스트 형식에 맞게 설계되었으며 임의의 소스 언어, 유형 시스템 및 선형 메모리를 사용하는 WebAssembly와 같은 바이너리 형식에 맞게 설계되었습니다. 이로 인해 통합이 해킹되고 제한되며 Emscripten 외부에서 광범위하게 지원되지 않았습니다.

DWARF 입력

반면 많은 네이티브 언어에는 이미 디버거가 위치, 변수 이름, 유형 레이아웃 등을 확인하는 데 필요한 모든 정보를 제공하는 공통 디버깅 형식인 DWARF가 있습니다.

완전한 호환성을 위해 추가해야 할 WebAssembly 관련 기능이 아직 있지만 Clang 및 Rust와 같은 컴파일러는 이미 WebAssembly 모듈에서 DWARF 정보를 내보내는 것을 지원하므로 DevTools팀에서 DevTools에서 직접 이를 사용할 수 있게 되었습니다.

첫 단계로, DevTools는 이제 이 정보를 사용하여 네이티브 소스 매핑을 지원하므로, 디스어셈블된 형식에 의존하거나 맞춤형 스크립트를 사용하지 않고도 이러한 컴파일러에서 생성한 Wasm 모듈 디버깅을 시작할 수 있습니다.

대신 다른 플랫폼에서 평소와 같이 디버그 정보를 포함하도록 컴파일러에 지시하기만 하면 됩니다. 예를 들어 Clang 및 Emscripten에서는 컴파일 중에 -g 플래그를 전달하여 이를 실행할 수 있습니다.

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

  emcc -g …sources… -o out.js

Rust에서도 동일한 -g 플래그를 사용할 수 있습니다.

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

Cargo를 사용하는 경우 디버그 정보가 기본적으로 포함됩니다.

  cargo build --target wasm32-unknown-unknown

DWARF와 새롭게 통합된 DevTools에는 소스 언어에서 코드 스테핑, 중단점 설정, 스택 트레이스 확인에 대한 지원이 이미 포함되어 있습니다.

새로운 DWARF 기반 디버깅의 스크린샷

앞으로

하지만 아직 할 일이 많이 남아 있습니다. 예를 들어 도구 측면에서 Emscripten (Binaryen)과 wasm-pack (wasm-bindgen)은 아직 수행하는 변환에 관한 DWARF 정보 업데이트를 지원하지 않습니다. 현재로서는 이러한 통합의 이점을 누릴 수 없습니다.

Chrome DevTools 측에서는 원활한 디버깅 환경을 제공하기 위해 다음과 같은 통합을 점진적으로 발전시켜 나갈 예정입니다.

  • 변수 이름 확인
  • 프리티 프린팅 유형
  • 소스 언어로 표현식 평가
  • 그 외에도 다양한 기능 제공

향후 업데이트 소식을 기다려 주세요.

미리보기 채널 다운로드

Chrome Canary, Dev 또는 베타를 기본 개발 브라우저로 사용하는 것이 좋습니다. 이러한 미리보기 채널을 통해 최신 DevTools 기능에 액세스하고, 최첨단 웹 플랫폼 API를 테스트하고, 사용자보다 먼저 사이트에서 문제를 발견할 수 있습니다.

Chrome DevTools 팀에 문의하기

다음 옵션을 사용하여 게시물의 새로운 기능 및 변경사항 또는 DevTools와 관련된 기타 사항을 논의하세요.