PDB ファイル形式とは?
.pdb ファイルにはプログラムのデータベースが含まれています。具体的には、Microsoft Visual C++ ツールチェーンによって生成されたデバッグシンボル、ソースファイルのマッピング、および型情報の構造化されたストアです。これらはコンパイル元の対応する .exe または .dll と組み合わせて使用されます。これらのバイナリの内部に埋め込まれているのではなく、別のファイルとして配布されます。
デバッグ情報
.pdb ファイルに保存されているデバッグシンボルにより、デバッガは例外に関する重要な情報を中継したり、メモリアドレスをソースファイルの行番号にマッピングしたり、最終的なバイナリから削除された関数名や変数名を公開したりできます。これらは、開発環境と本番環境の両方でプログラムのトラブルシューティングやエラー対処を行う際に役立ちます。
.pdb ファイルの作成方法
.pdb ファイルは、コンパイルプロセス中に MSVC コンパイラ (cl.exe) とリンカー (link.exe) によってソースファイルから生成されます。これらは Just-In-Time (JIT) コンパイルの産物では「ありません」。これはよくある誤解です。現代の .pdb ファイルは、Visual Studio .NET で導入された MSF 7.00 (Multi-Stream File) バイナリコンテナを使用しています。各 .pdb は GUID と Age カウンタを介してバイナリに関連付けられており、異なるビルドの .pdb は読み込まれません。フォーマットがプロプライエタリであるため、Visual Studio、WinDbg、llvm-pdbutil などの専用ツールのみが読み取ることができますが、Microsoft はリファレンス実装を公開しています。
セキュリティと安全性
リスク: LOWPDB はデバッガによって読み取られるパッシブなデータです。実行可能コードは含まれていないため、開いても安全です。本当の懸念はマルウェアではなく機密性です。PDB は内部の関数名、ソースファイルのパス、コード構造を明らかにするため、配布したり漏洩したりすると、ソフトウェアの内部情報が公開されてしまいます(リバースエンジニアにとって有用です)。リリース用の PDB は製品に同梱せず、プライベートなシンボルサーバーに保管してください。
形式の詳細
概要- Palm OS データベース (PalmPilot / eReader 書籍) - PRC/PDB Palm データベース - 電子書籍や PDA アプリデータ(オフセット 0x3C にヘッダー '...')。Visual Studio ではなく Palm/eReader ツールで開かれます。
- Protein Data Bank 分子構造 - 分子の 3D 原子座標を記述するプレーンテキストの PDB ファイル。PyMOL/Chimera/Jmol で開かれます。
- Quicken 価格/ポートフォリオデータ (.pdb) - Intuit Quicken が書き出した .pdb データファイル。データベースが誤って「Quicken」オープナーに関連付けられた際の意味です。
PDB ファイルを開くプログラム
技術的詳細
詳細仕様| コンテナ形式 | MSF (Multi-Stream File) - 単一ファイル内に複数の名前付きデータストリームを保持する、ページベースの内部ストリームコンテナ |
| ファイルシグネチャ (マジックバイト) | ASCII 文字列 `Microsoft C/C++ MSF 7.00` で始まり、その後に CR LF とオフセット 0 の特定の制御バイトが続きます。レガシーな PDB 2.0 ファイルは `Microsoft C/C++ program database 2.00` で始まります |
| エンコーディング | バイナリ、全体を通してリトルエンディアンのバイト順 |
| 内部ストリーム | DBI (デバッグ情報)、TPI/IPI (型および ID レコード)、パブリックおよびグローバルシンボルストリーム、モジュールごとのシンボルストリーム、ソース/行番号マッピングテーブル |
| バイナリリンクキー | `.pdb` と、ペアになる `.exe` または `.dll` のデバッグディレクトリの両方に書き込まれる GUID + Age カウンタ。不一致があるとデバッガはシンボルファイルを拒否します |
| 一般的なファイルサイズ | 100 KB から 500 MB。大規模なネイティブ C++ プロジェクトでは、日常的に数百メガバイトの `.pdb` ファイルが生成されます |
| 圧縮 | なし - データはページ構造化されていますが、圧縮はされていません |
| ページサイズ | MSF 7.00 (BigMsf) では 4 KB ページ。古い MSF 2.0 コンテナではより小さいページサイズが使用されていました |
| フォーマットのバリエーション | PDB 2.00 (レガシーな JG マジック、MSVC 6.0 以前)、MSF 7.00 / BigMsf (Visual Studio .NET 以降、現在の C/C++ 用)、Portable PDB (.NET/Roslyn で使用される別のクロスプラットフォーム形式) |
| 生成ツールチェーン | MSVC コンパイラ (`cl.exe`) およびリンカー (`link.exe`)。また、`/Z7` または `/Zi` コンパイラフラグを使用して Windows をターゲットにする場合、Clang/LLVM によっても出力されます |
| 消費ツール | Visual Studio Debugger、WinDbg、DIA SDK、`llvm-pdbutil`、`dumpbin`、および CrashPad や Breakpad シンボルコンバータなどのクラッシュ分析ツール |
| シンボルサーバーのサポート | `.pdb` ファイルは、シンボルサーバー上で GUID + Age によってインデックス付けされます (`symstore.exe` または互換サーバー経由)。デバッガはバイナリのデバッグディレクトリにあるキーを使用して、必要に応じて正しいコピーを取得します |
| プラットフォームのサポート | Windows 上でネイティブ。Linux および macOS では LLVM ツール (`llvm-pdbutil`、LLDB) を介したクロスプラットフォームの読み取りが可能 |
| MIME タイプ | application/octet-stream (専用の登録済み MIME サブタイプはなし) |
| デプロイメントパターン | ビルドターゲット (`.exe` または `.dll`) ごとに 1 つの `.pdb`。バイナリと一緒に別のファイルとして配布されるか、プライベート/パブリックなシンボルサーバーに保存されます。バイナリ自体には埋め込まれません |
| リリース日 | 1990s (Microsoft Visual C++); MSF 7.00 container since Visual Studio .NET era |
| 最新バージョン | MSF 7.00 ('BigMsf'); portable PDB used by .NET/Roslyn alongside it |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | github.com |
PDB の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。PDB ファイルについて最初の質問をしてみましょう。
よくある質問
Visual Studio における PDB ファイルとは何ですか?
.pdb ファイルを開くにはどうすればよいですか?
llvm-pdbutil や DIA ベースのツールを使用して、シンボルをテキストとしてダンプします。