PDBファイル形式¶
はじめに¶
PDB(プログラムデータベース)は、Microsoftによって考案されたファイル形式であり、デバッガーやその他のツールで使用できるデバッグ情報が含まれています。PDBからデバッグ情報をクエリするための公式にサポートされているAPIがWindowsに存在するため、ユーザーがファイル形式の内部を理解していなくても、Windowsでこの形式を使用するツールの大きなエコシステムが構築されています。Clangがこれらのツールと相互運用できるプログラムを生成できるようにするには、私たち自身でPDBファイルを生成する必要があります。
同時に、LLVMは任意のプラットフォームから任意のプラットフォームへのクロスコンパイルを可能にする長い歴史を持っており、ここで同じことが当てはまることを願っています。そのため、PDBファイルを完全に独自に生成できるように、バイトレベルでPDBファイル形式を理解する必要があります。
このマニュアルでは、今日私たちが知っているPDBファイル形式について説明します。ファイルのレイアウト、含まれるさまざまなストリーム、個々のレコード内の形式などについて説明します。
Microsoftに心から感謝の意を表します。彼らがいなければ、私たちは今日ここにいなかったでしょう。このマニュアルに含まれる知識の多くは、Microsoftが彼らのGitHubリポジトリで公開したコードを読むことによって学びました。
ファイルレイアウト¶
重要
特に指定がない限り、すべての数値はリトルエンディアンでエンコードされます。今後、uint16_t
やuint64_t
などの型が表示される場合は、常にリトルエンディアンであると想定してください!
MSFコンテナ¶
PDBファイルは、MSF(マルチストリーム形式)ファイルです。MSFファイルは「ファイル内のファイルシステム」です。これには、任意のデータを表すことができる複数のストリーム(別名ファイル)が含まれており、これらのストリームは、必ずしもMSFコンテナファイル内で連続して配置されているとは限らないブロックに分割されています。さらに、MSFには、ストリーム(ファイル)がMSF内でどのように配置されているかを記述するストリームディレクトリ(別名MFT)が含まれています。
MSFコンテナ形式、ストリームディレクトリ、およびブロックレイアウトの詳細については、MSFファイル形式を参照してください。
ストリーム¶
PDB形式には、プログラムの型、シンボル、ソースファイル、コンパイル単位(例:オブジェクトファイル)などのさまざまな情報を記述する多数のストリームが含まれています。また、デバッガーやその他のツールが名前でレコードや型を高速に検索するために使用するハッシュテーブルを含む追加のストリームや、使用された特定のツールチェーンなど、プログラムのコンパイル方法に関するその他のさまざまな情報も含まれています。PDBファイルに含まれるストリームの概要は次のとおりです。
名前 |
ストリームインデックス |
コンテンツ |
---|---|---|
古いディレクトリ |
|
|
PDBストリーム |
|
|
TPIストリーム |
|
|
DBIストリーム |
|
|
IPIストリーム |
|
|
/LinkInfo |
|
|
/src/headerblock |
|
|
/names |
|
|
モジュール情報ストリーム |
|
|
パブリックストリーム |
|
|
グローバルストリーム |
|
|
TPIハッシュストリーム |
|
|
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型レコードのページを参照してください。