Chrome DevTools의 WebAssembly 디버깅 개선

Ingvar Stepanyan
Ingvar Stepanyan

배경

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

이전에 제한되었던 WebAssembly 디버깅 지원의 스크린샷 
            Chrome DevTools를 사용할 수 있습니다.

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

임시 해결 방법

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

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

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

DWARF 입력

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

완전한 호환성을 위해 추가해야 하는 WebAssembly 관련 기능이 아직 남아 있지만, Clang 및 Rust와 같은 컴파일러는 이미 WebAssembly 모듈에서 DWARF 정보 방출을 지원하고 있어 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와 관련된 다른 사항에 대해 논의하세요.

  • crbug.com을 통해 제안이나 의견을 보내주세요.
  • 옵션 더보기   더보기 >를 사용하여 DevTools 문제 신고 도움말 > DevTools에서 DevTools 문제를 신고합니다.
  • @ChromeDevTools에서 트윗하세요.
  • DevTools의 새로운 기능 YouTube 동영상 또는 DevTools 도움말 YouTube 동영상에 의견을 남겨주세요.