PDBファイル形式

はじめに

PDB(プログラムデータベース)は、Microsoftによって考案されたファイル形式であり、デバッガーやその他のツールで使用できるデバッグ情報が含まれています。PDBからデバッグ情報をクエリするための公式にサポートされているAPIがWindowsに存在するため、ユーザーがファイル形式の内部を理解していなくても、Windowsでこの形式を使用するツールの大きなエコシステムが構築されています。Clangがこれらのツールと相互運用できるプログラムを生成できるようにするには、私たち自身でPDBファイルを生成する必要があります。

同時に、LLVMは任意のプラットフォームから任意のプラットフォームへのクロスコンパイルを可能にする長い歴史を持っており、ここで同じことが当てはまることを願っています。そのため、PDBファイルを完全に独自に生成できるように、バイトレベルでPDBファイル形式を理解する必要があります。

このマニュアルでは、今日私たちが知っているPDBファイル形式について説明します。ファイルのレイアウト、含まれるさまざまなストリーム、個々のレコード内の形式などについて説明します。

Microsoftに心から感謝の意を表します。彼らがいなければ、私たちは今日ここにいなかったでしょう。このマニュアルに含まれる知識の多くは、Microsoftが彼らのGitHubリポジトリで公開したコードを読むことによって学びました。

ファイルレイアウト

重要

特に指定がない限り、すべての数値はリトルエンディアンでエンコードされます。今後、uint16_tuint64_tなどの型が表示される場合は、常にリトルエンディアンであると想定してください!

MSFコンテナ

PDBファイルは、MSF(マルチストリーム形式)ファイルです。MSFファイルは「ファイル内のファイルシステム」です。これには、任意のデータを表すことができる複数のストリーム(別名ファイル)が含まれており、これらのストリームは、必ずしもMSFコンテナファイル内で連続して配置されているとは限らないブロックに分割されています。さらに、MSFには、ストリーム(ファイル)がMSF内でどのように配置されているかを記述するストリームディレクトリ(別名MFT)が含まれています。

MSFコンテナ形式、ストリームディレクトリ、およびブロックレイアウトの詳細については、MSFファイル形式を参照してください。

ストリーム

PDB形式には、プログラムの型、シンボル、ソースファイル、コンパイル単位(例:オブジェクトファイル)などのさまざまな情報を記述する多数のストリームが含まれています。また、デバッガーやその他のツールが名前でレコードや型を高速に検索するために使用するハッシュテーブルを含む追加のストリームや、使用された特定のツールチェーンなど、プログラムのコンパイル方法に関するその他のさまざまな情報も含まれています。PDBファイルに含まれるストリームの概要は次のとおりです。

名前

ストリームインデックス

コンテンツ

古いディレクトリ

  • 固定ストリームインデックス0

  • 前のMSFストリームディレクトリ

PDBストリーム

  • 固定ストリームインデックス1

  • 基本ファイル情報

  • このPDBにEXEを一致させるためのフィールド

  • ストリームインデックスへの名前付きストリームのマッピング

TPIストリーム

  • 固定ストリームインデックス2

  • CodeView型レコード

  • TPIハッシュストリームのインデックス

DBIストリーム

  • 固定ストリームインデックス3

  • モジュール/コンパイル単位情報

  • 個々のモジュールストリームのインデックス

  • パブリック/グローバルストリームのインデックス

  • セクション貢献情報

  • ソースファイル情報

  • FPO/PGOデータを含むストリームへの参照

IPIストリーム

  • 固定ストリームインデックス4

  • CodeView型レコード

  • IPIハッシュストリームのインデックス

/LinkInfo

  • PDBストリームの名前付きストリームマップに含まれます

  • 不明

/src/headerblock

  • PDBストリームの名前付きストリームマップに含まれます

  • 埋め込まれたソースファイルコンテンツ(例:natvisファイル)の概要

/names

  • PDBストリームの名前付きストリームマップに含まれます

  • 文字列の重複排除に使用されるPDB全体のグローバル文字列テーブル

モジュール情報ストリーム

  • DBIストリームに含まれます

  • 各コンパイル単位に1つ

  • このモジュールのCodeViewシンボルレコード

  • 行番号情報

パブリックストリーム

  • DBIストリームに含まれます

  • パブリック(エクスポートされた)シンボルレコード

  • パブリックハッシュストリームのインデックス

グローバルストリーム

  • DBIストリームに含まれます

  • 単一の結合されたシンボルテーブル

  • グローバルハッシュストリームのインデックス

TPIハッシュストリーム

  • TPIストリームに含まれます

  • 名前でTPIレコードを検索するためのハッシュテーブル

IPIハッシュストリーム

  • IPIストリームに含まれます

  • 名前でIPIレコードを検索するためのハッシュテーブル

これらの各構造の詳細については、次のページにあります。

PDB情報ストリーム(別名PDBストリーム)

PDB情報ストリームと、それがPDBをEXEと一致させるためにどのように使用されるかについての情報。

PDB TPIおよびIPIストリーム

TPIストリームと、その中に含まれるCodeViewレコードについての情報。

PDB DBI(デバッグ情報)ストリーム

DBIストリームと、モジュールサブストリーム、ソースファイル情報、およびその中に含まれるCodeViewシンボルレコードを含む関連するサブストリームについての情報。

モジュール情報ストリーム

モジュール情報ストリームについての情報。これは、各コンパイルユニットに1つあり、その中に含まれるシンボルの形式についての情報です。

PDBパブリックシンボルストリーム

パブリックシンボルストリームについての情報。

PDBグローバルシンボルストリーム

グローバルシンボルストリームについての情報。

PDBシリアライズドハッシュテーブル形式

TPI/IPIストリームで名前付きストリームマップやハッシュアジャスターなどのものを内部で表現するために使用される、シリアライズドハッシュテーブル形式についての情報。

CodeView

CodeViewは、考慮される別の形式です。MSFはファイル全体の構造を定義し、PDBはMSFファイル内に表示されるストリームのセットとそのストリームの形式を定義しますが、CodeViewは特定のストリーム内に表示されるシンボルおよび型レコードの形式を定義します。CodeView形式の詳細については、CodeViewシンボルレコードおよびCodeView型レコードのページを参照してください。