이 출시되었습니다! 11월의 새로운 기능 및 수정 사항을 읽어보세요.

디버그 어댑터 프로토콜의 새 홈

2018년 8월 7일 André Weinand, @weinand

7월 마일스톤의 한 가지 목표는 다소 모호한 GitHub 프로젝트에 숨어 있던 디버그 어댑터 프로토콜을 더 눈에 띄는 웹사이트로 옮기는 것이었습니다 (기능 요청 #19636 참조).

이 블로그에서는 프로토콜, 디버그 어댑터 프로토콜 및 이전 동기에 대한 배경 정보를 제공합니다.

프로토콜을 사용한 분리의 필요성은 무엇인가?

다른 블로그에서

"Visual Studio Code는 프로그래밍 언어에 관계없이 모든 개발자를 위한 편집기입니다."

이 약속은 (최소한) 두 가지 기둥에 기반합니다.

  • 누구나 쉽게 기여할 수 있는 확장 가능한 도구 플랫폼 및 생태계.
  • 모든 프로그래밍 언어에 대한 훌륭한 도구 지원을 쉽게 추가할 수 있는 기술.

개발 도구에서 프로그래밍 언어를 지원한다는 것은

  • 언어에 대한 깊은 이해를 기반으로 한 풍부한 편집 지원 (일명 "언어 스마트니스").
  • 편집 도구에 통합된 언어에 대한 디버깅 지원.

후자는 일부에게 놀라움을 줄 수 있지만, 디버깅은 소스 코드가 작성되는 곳, 즉 편집기의 필수적인 부분이라는 것이 항상 우리의 확고한 믿음이었습니다. 디버깅은 개발 "내부 루프"의 중요한 부분입니다.

하지만 IDE나 편집기에 새로운 언어에 대한 디버거를 추가하는 것은 표준 디버깅 기능 목록이 작지 않기 때문에 상당한 노력이 필요합니다.

  • 소스, 함수, 조건부, 인라인 중단점 및 로그포인트.
  • 호버 시 또는 소스에 인라인으로 표시되는 변수 값.
  • 다중 프로세스 및 다중 스레드 지원.
  • 복잡한 데이터 구조를 탐색합니다.
  • 감시 표현식.
  • 자동 완성(REPL)을 통한 대화형 평가를 위한 디버그 콘솔.

새로운 언어에 대해 이러한 기능을 구현하는 것은 상당한 노력일 뿐만 아니라, 각 도구가 사용자 인터페이스를 구현하기 위해 다른 API를 사용하므로 이 작업이 각 개발 도구에 대해 반복되어야 한다는 점은 실망스럽습니다.

이는 다음 그림에서 파란색 상자로 시각화된 것처럼 많은 중복 기능 (및 구현)으로 이어집니다.

without Debug Adapter Protocol

Visual Studio Code 작업을 시작할 때, 우리는 언어별 "백엔드" 구현에서 "프런트엔드" UI를 가능한 한 많이 분리하는 것을 항상 예상했습니다. 우리는 언어 스마트니스와 디버깅 지원 모두에 대해 이를 수행하고자 했습니다.

오늘날 우리는 이 야심찬 목표를 달성했다고 믿습니다.

"프런트엔드"의 편집 및 디버깅 사용자 인터페이스를 "백엔드" 구성 요소가 제공하는 언어별 스마트니스 및 디버깅 기능에서 분리할 수 있는 두 개의 추상 프로토콜을 만들었습니다.

"언어에 대한 깊은 이해"는 언어 서버 프로토콜(LSP)을 통해 노출되고, "디버깅 지원"은 디버그 어댑터 프로토콜(DAP)을 통해 노출됩니다.

디버그 어댑터 프로토콜

디버그 어댑터 프로토콜의 아이디어는 개발 도구의 디버깅 구성 요소가 구체적인 디버거 또는 런타임과 통신하는 방법에 대한 추상 프로토콜을 표준화하는 것입니다.

기존 디버거 또는 런타임이 곧 이 프로토콜을 채택할 것이라고 가정하는 것은 비현실적이므로, 대신 기존 디버거 또는 런타임 API를 디버그 어댑터 프로토콜에 맞게 조정하는 중개 구성 요소를 설계했습니다. 이 중개자가 디버그 어댑터가 되며, 이것이 프로토콜 이름의 이유입니다: 디버그 어댑터 프로토콜.

다음은 개발 도구가 인기 있는 "gdb" 디버거에 대한 디버그 어댑터와 통신하기 위해 DAP를 사용하는 방법에 대한 예입니다.

breakpoint

사용자가 이미 디버그 세션을 시작했지만 현재 프로그램의 진입점에서 중지되어 있으며 중단점을 설정하고 (나중에 히트) 하려고 한다고 가정합니다.

  • 사용자는 중단점 표시줄을 클릭하여 특정 소스 파일에 하나 이상의 중단점을 설정합니다. 개발 도구는 디버그 어댑터에 setBreakpoints 요청을 보내고, 디버그 어댑터는 gdb 디버거에 중단점을 등록합니다.
  • 사용자는 계속 버튼을 눌러 실행을 재개합니다. 도구는 디버그 어댑터에 continue 요청을 보내고, 디버그 어댑터는 이를 해당하는 gdb 명령으로 변환합니다.
  • 얼마 후 중단점이 히트되고 디버그 어댑터는 gdb로부터 일부 알림을 받아 이를 개발 도구로 전송되는 DAP stopped 이벤트로 변환합니다.
  • stopped 이벤트에 응답하여 개발 도구는 UI를 업데이트하고 스택 추적 보기를 표시합니다. 이는 stacktrace 요청을 트리거하고, 개별 스택 프레임에 표시되는 모든 정보를 반환합니다.
  • 사용자가 스택 프레임을 선택하면 개발 도구는 variables 요청으로 해당 프레임의 변수를 요청합니다.

역사적인 이유로 DAP는 (이제 사용되지 않는) V8 디버깅 프로토콜에서 영감을 받은 JSON 기반 와이어 포맷을 사용합니다. 이 형식은 LSP에서 사용되는 JSON-RPC와 유사하지만 호환되지 않음을 유의하십시오.

DAP 통신에 대한 이 짧은 예시 후, DAP 접근 방식의 특징을 검토해 봅시다.

with Debug Adapter Protocol

그림은 DAP 접근 방식의 두 가지 중요한 이점을 보여줍니다.

  • 디버그 어댑터는 다른 개발 도구 간에 공유될 수 있으므로 개발 비용을 상각하는 데 도움이 됩니다.
  • 디버그 어댑터 프로토콜은 VS Code에 국한되지 않으며 다른 개발 도구에서 일반적인 디버거 UI의 기반으로 사용될 수 있습니다.

이러한 특징은 2016년에 자체 웹사이트에 게시된 언어 서버 프로토콜의 특징과 유사합니다.

DAP를 위한 새로운 보금자리

이제 DAP 사양을 이전 위치에서 새로운 웹사이트 https://microsoft.github.io/debug-adapter-protocol 및 해당 저장소 https://github.com/microsoft/debug-adapter-protocol으로 옮겨 DAP에 대해서도 같은 일을 했습니다.

이 이전은 디버그 어댑터 프로토콜이 Visual Studio Code에 국한되지 않음을 강조해야 합니다. 예를 들어, Visual Studio도 이제 이 프로토콜을 지원합니다.

새로운 위치에서 제공합니다.

이전 위치는 DAP용 세 가지 npm 모듈의 소스를 계속 호스팅합니다.

다음 단계?

디버그 어댑터 프로토콜은 이미 상당한 시간 동안 제공되었으므로, 새 웹사이트로의 이전은 실제로 시작이 아니라 단순히 새 보금자리로의 이전입니다...

DAP의 기존 및 미래 사용자 여러분께 새로운 보금자리를 방문하여 그곳에서 협업을 계속하도록 초대합니다. 예를 들어, 다음 Markdown 파일에 대한 풀 요청을 GitHub에 제출하여 지원 도구 및 구현 목록을 최신 상태로 유지하는 데 도움을 줄 수 있습니다: 디버그 어댑터, 도구SDK.

VS Code 팀을 대표하여: 즐거운 코딩 되세요!

André Weinand -  Twitter의 @weinand

© . This site is unofficial and not affiliated with Microsoft.