デバッグ情報
デバッグ情報とは、プログラムの実行中にデバッガーがプログラムの状態を正しく解釈できるように、 コンパイラによって生成される情報の集合です。これには、命令アドレスをソースファイル内のコード行に マッピングする情報や、メモリ内のバイト列を意味のある方法で読み取って表示できるようにするための 型レイアウト情報などが含まれます。
デバッグ情報という用語はやや多義的で、Rust MIR から、エンドユーザーが画面上でデバッガーの出力を 見るまでのすべての層を指すことがあります。簡潔に言うと、最初から最後までのスタックは次のとおりです。
- Rustc が MIR を検査し、関連するソース、シンボル、型情報を LLVM に伝達する
- LLVM がコンパイル中にこの情報をターゲット固有のデバッグ情報形式へ変換する
- デバッガーがデバッグ情報を読み取って解釈し、ソース行をマッピングし、デバッグ対象の メモリ内の変数を正しいレイアウトで特定して読み取れるようにする
- 組み込みのデバッガーフォーマットとスタイルが変数に適用される
- ユーザー定義スクリプトが実行され、変数に追加のフォーマットとスタイルを適用する
- デバッガーフロントエンドが、場合によっては追加の API レイヤー(例: Debug Adapter Protocol を介した VSCode 拡張機能) を通じて、変数をユーザーに表示する
注: 開発ガイドのこのサブセクションは、必要以上に詳細かもしれません。散在している大量の情報を 1 か所に集約し、デバッグスタック全体について可能な限り確かな理解を読者に提供することを目的としています。
ビジュアライザースクリプトの作業だけに関心がある場合は、 debugger-visualizers と testing の情報で十分です。Rust のデバッグノード生成に変更を加える必要がある場合は、 rust-codegen を参照してください。その他のセクションは補足的なものですが、 ビジュアライザーやコード生成が行う必要のある妥協点の一部を理解するうえで重要な場合があります。 また、問題が 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 に関する情報を見つけるのは非常に困難です。多くの情報源は 作成時期が大きく異なり、不完全または多少矛盾した情報を含んでいます。そのため、このページでは可能な限り 多くの情報源を集約することを目指します。
- CodeView 1.0 仕様
- LLVM
- Microsoft
- microsoft-pdb - PDB リーダーの C/C++ 実装です。 この実装には完全な PDB または CodeView の仕様は含まれていませんが、他の PDB コンシューマーを 作成するために十分な情報は含まれています。執筆時点(2025 年 11 月)では、 このリポジトリは数年間アーカイブされています。
- pdb-rs - 他の公開情報に基づく Rust ベースの PDB リーダー兼ライターです。
安定性や仕様準拠は保証されません。また、PDB ファイルをダンプできる
pdbtoolも含まれています (cargo install pdbtool) - Debug Interface Access SDK。 PDB 形式を直接文書化しているわけではありませんが、インターフェイス自体から詳細を読み取ることができます。
デバッガー
Rust は 3 つの主要なデバッガー、GDB、LLDB、CDB をサポートしています。それぞれに独自の要件、 制限、癖があります。残念ながら、これにより考慮すべき範囲が広くなっています。
注: CDB は Microsoft が作成したプロプライエタリなデバッガーです。基盤となるエンジンは WinDbg、KD、VSCode 向け Microsoft C/C++ 拡張機能、および Visual Studio Debugger の一部も 支えています。これらのドキュメントでは、一貫性のために CDB と呼びます
GDB と LLDB は Rust の値レイアウトをネイティブにサポートする機能を提供していますが、これは 完全に必須ではありません。Rust は現在、C++ のものと非常によく似たデバッグ情報を出力しており、 Rust サポートのないデバッガーでも、やや劣化した体験で動作できます。詳細は後のセクションに含めますが、 各デバッガーの機能の簡単なリファレンスを次に示します。
| デバッガー | デバッグ情報形式 | ネイティブ Rust サポート | 式のスタイル | ビジュアライザースクリプト |
|---|---|---|---|---|
| GDB | DWARF | 完全 | Rust | Python |
| LLDB | DWARF と PDB | 部分的 | C/C++ | Python |
| CDB | PDB | なし | C/C++ | Natvis |
重要: CDB は Windows 上でのみ実行されると想定できます。GDB または LLDB が実行される OS については いかなる想定もできません。
サポート対象外
以下は、将来に影響を与える可能性があるため特に注目すべき、サポート対象外のデバッガーです。
- Bugstalker は Rust で書かれた x86-64 Linux デバッガーで、 Rust プログラムのデバッグに特化しています。有望ではありますが、まだ開発初期段階です。
- RAD Debugger は Windows 専用の GUI デバッガーです。 PDB が変換される独自のデバッグ情報形式を持っています。このプロジェクトには、リンク段階で その新しいデバッグ情報形式を生成できるリンカーも含まれています。