Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

디버그 정보

디버그 정보는 컴파일러가 생성하는 정보의 모음으로, 디버거가 실행 중인 프로그램의 상태를 올바르게 해석할 수 있게 해 줍니다. 여기에는 명령어 주소를 소스 파일의 코드 줄에 매핑하는 정보와 메모리의 바이트를 의미 있는 방식으로 읽고 표시할 수 있게 하는 타입 레이아웃 정보 등이 포함됩니다.

디버그 정보는 Rust MIR부터 최종 사용자가 화면에서 디버거 출력을 보는 단계까지 모든 계층을 아우르기 때문에 다소 여러 의미로 쓰이는 용어일 수 있습니다. 간단히 말해, 처음부터 끝까지의 스택은 다음과 같습니다.

  1. Rustc가 MIR을 검사하고 관련 소스, 심볼, 타입 정보를 LLVM에 전달합니다
  2. LLVM이 컴파일 중에 이 정보를 대상별 디버그 정보 형식으로 변환합니다
  3. 디버거가 디버그 정보를 읽고 해석하여 소스 줄을 매핑하고, 디버깅 대상의 메모리에 있는 변수를 찾아 올바른 레이아웃으로 읽을 수 있게 합니다
  4. 디버거에 내장된 서식과 스타일이 변수에 적용됩니다
  5. 사용자 정의 스크립트가 실행되어 변수에 서식과 스타일을 추가로 적용합니다
  6. 디버거 프런트엔드가 사용자에게 변수를 표시하며, 이때 추가 API 계층을 거칠 수도 있습니다(예: Debug Adapter Protocol을 통한 VSCode 확장)

참고: 개발 가이드의 이 하위 절은 필요 이상으로 자세할 수도 있습니다. 이 절은 흩어져 있는 많은 정보를 한곳에 모아, 독자가 디버그 스택 전체를 최대한 확실하게 파악할 수 있도록 하는 것을 목표로 합니다.

시각화 스크립트 작업에만 관심이 있다면 디버거 시각화 및 테스트의 정보로 충분합니다. Rust의 디버그 노드 생성 방식을 변경해야 한다면 rust-codegen(Rust 코드 생성) 문서를 참조하십시오. 나머지 절은 모두 보충 자료이지만, 시각화 도구나 코드 생성이 감수해야 하는 몇몇 절충점을 이해하는 데 중요할 수 있습니다. 또한 어떤 문제를 LLVM이나 디버거 자체에서 해결하는 편이 더 나은 경우를 아는 데에도 도움이 될 수 있습니다.

DWARF

이는 *-gnu 대상의 주요 디버그 정보 형식입니다. 일반적으로 바이너리에 함께 포함되지만, 별도의 파일로 생성할 수도 있습니다. DWARF 표준은 여기에서 볼 수 있습니다.

참고: DWARF 디버그 정보를 검사하려면 gimli를 프로그래밍 방식으로 사용할 수 있습니다. GUI를 선호한다면 필자는 DWEX를 추천합니다

PDB/CodeView

*-msvc 대상의 주요 디버그 정보 형식입니다. PDB는 Microsoft가 만든 독점 컨테이너 형식으로, 안타깝게도 여러 의미로 쓰입니다. Portable PDB는 주로 .Net 애플리케이션에 사용되므로, 여기서는 일반 PDB 파일을 다룹니다. PDB 파일은 컴파일된 바이너리와 분리되어 있으며 .pdb 확장자를 사용합니다.

PDB 파일에는 DWARF의 태그에 해당하는 CodeView 객체가 들어 있습니다. CodeView 객체를 사용하던 디버거인 CodeView는 1985년에 처음 출시되었습니다. 원래는 C 디버깅을 위한 것이었으며, 이후 Visual C++를 지원하도록 확장되었습니다. 최신 아키텍처와 언어를 지원하기 위해 지금도 형식이 조금씩 변경되고 있지만, 이러한 변경 사항 중 상당수는 문서화되어 있지 않거나 거의 사용되지 않습니다.

CodeView 객체를 다룰 때는 이러한 배경을 염두에 두는 것이 중요합니다. 이러한 기원 때문에 이 객체들의 “기능 집합“은 매우 제한적이며, C의 핵심 기능을 중심으로 구성되어 있습니다. 최신 DWARF 표준이 제공하는 여러 편의성이나 기능 상당수를 갖추고 있지 않습니다. 디버그 정보 스택 내에는 CodeView의 단점을 보완하기 위한 우회 방법이 상당수 존재합니다.

독점 포맷이라는 특성 때문에 PDB와 CodeView에 관한 정보를 찾기는 매우 어렵습니다. 상당수 자료는 서로 크게 다른 시기에 작성되었으며, 불완전하거나 다소 모순되는 정보를 담고 있습니다. 따라서 이 페이지는 가능한 한 많은 자료를 모으는 것을 목표로 합니다.

  • TIS PE 명세에는 “Microsoft Symbol and Type Information“이라는 제목의 긴 절이 포함되어 있으며, CodeView 포맷의 상당 부분을 자세히 설명합니다. 이 문서는 1993년에 작성되었지만, 정보가 여전히 상세하고 정확하며 유용한 도식도 담고 있습니다.
  • LLVM
  • Microsoft
    • microsoft-pdb - PDB 리더의 C/C++ 구현입니다. 이 구현에는 PDB나 CodeView의 전체 명세가 담겨 있지는 않지만, 다른 PDB 소비자를 작성할 수 있을 만큼의 정보는 담겨 있습니다. 이 글을 작성하는 시점(2025년 11월) 기준으로, 이 저장소는 수년째 보관(archived) 상태입니다.
    • pdb-rs - 공개된 다른 정보를 바탕으로 만든 Rust 기반 PDB 리더 겸 라이터입니다. 안정성이나 명세 준수를 보장하지 않습니다. PDB 파일을 덤프할 수 있는 pdbtool도 포함하고 있습니다(cargo install --locked pdbtool).
    • Debug Interface Access SDK입니다. PDB 포맷을 직접 문서화하지는 않지만, 인터페이스 자체에서 세부 사항을 파악할 수 있습니다.
    • PDB-Documentation - PDB와 CodeView에 관해 공개된 정보의 상당 부분을 모아 둔 자료입니다.

디버거

Rust는 세 가지 주요 디버거인 GDB, LLDB, CDB를 지원합니다. 각 디버거에는 저마다의 요구 사항, 제약, 특이한 동작이 있습니다. 안타깝게도 이 때문에 고려해야 할 범위가 넓어집니다.

참고: CDB는 Microsoft가 만든 독점 디버거입니다. 그 기반 엔진은 WinDbg, KD, VSCode용 Microsoft C/C++ 확장, 그리고 Visual Studio 디버거의 일부에도 사용됩니다. 이 문서에서는 일관성을 위해 이를 CDB라고 부릅니다.

GDB와 LLDB는 Rust의 값 레이아웃을 네이티브로 지원하는 기능을 제공하지만, 이것이 반드시 필요한 것은 아닙니다. 현재 Rust는 C++와 매우 유사한 디버그 정보를 출력하므로, Rust를 지원하지 않는 디버거에서도 다소 제한된 환경으로나마 작업할 수 있습니다. 자세한 내용은 이후 절에서 다루며, 여기서는 각 디버거의 기능을 간단히 정리합니다:

디버거디버그 정보 형식네이티브 Rust 지원표현식 스타일시각화 스크립트
GDBDWARF완전 지원RustPython
LLDBDWARF 및 PDB부분 지원C/C++Python
CDBPDB없음C/C++Natvis

중요: CDB는 Windows에서만 실행된다고 가정할 수 있습니다. GDB나 LLDB를 실행하는 OS에 대해서는 어떠한 가정도 할 수 없습니다.

지원되지 않음

아래는 향후 미칠 수 있는 영향 때문에 특히 주목할 만한, 지원되지 않는 디버거 몇 가지입니다.

  • Bugstalker는 Rust 프로그램을 디버깅하기 위해 특별히 Rust로 작성된 x86-64 Linux 디버거입니다. 유망하지만 아직 개발 초기 단계에 있습니다.
  • RAD Debugger는 Windows 전용 GUI 디버거입니다. 이 디버거에는 PDB를 변환해 담는 자체 디버그 정보 형식이 있습니다. 이 프로젝트에는 링크 단계에서 이 새로운 디버그 정보 형식을 생성할 수 있는 링커도 포함되어 있습니다.