| ファイル名拡張子 |
.pdb |
|---|---|
| インターネットメディアの種類 | アプリケーション/x-ms-pdb |
| 開発者 | マイクロソフト |
| フォーマットの種類 | デバッグ |
プログラム データベース( PDB ) は、プログラム (または、一般的にはDLLやEXEなどのプログラム モジュール)に関するデバッグ情報を格納するファイル形式 ( Microsoftによって開発) です。PDB ファイルの拡張子は通常 .pdb です。PDB ファイルは通常、コンパイル時にソース ファイルから作成されます。モジュール内のすべてのシンボルのリストとそのアドレス、および場合によってはファイル名とシンボルが宣言された行が格納されます。このシンボル情報は、多くのスペースを占有するため、モジュール自体には格納されません。[引用が必要]
アプリケーション
プログラムをデバッグすると、デバッガーは PDB ファイルからデバッグ情報を読み込み、それを使用してシンボルを検索したり、プログラム ソース コードの現在の実行状態を関連付けたりします。Microsoft Visual Studio は、デバッグ情報の主なファイル形式として PDB ファイルを使用します。
PDB ファイルのもう 1 つの用途は、ユーザーからクラッシュ データを収集し、それをクラッシュの原因となる (またはクラッシュに関係する) ソース コードの特定の部分に関連付けるサービスです。
Microsoft コンパイラは、適切なオプションを使用すると、コンパイルされたソースで見つかった型に関する情報を単一の PDB に保存します。各ソースに固有のデバッグ情報は、コンパイルされたオブジェクト ファイルに保存され、PDB 内の型への参照が含まれます。コンパイルごとに、PDB にまだ見つかっていない型がすべて PDB に追加されるため、既にコンパイルされたオブジェクト ファイル内の参照は有効なままです。
Microsoft リンカーは、適切なオプションの下で、入力モジュールにあるデバッグ情報、それらのモジュールによって参照される型、およびリンカーによって生成されるその他の情報を組み合わせた、完全に新しい PDB を構築します。リンクが増分的に実行される場合、既存の PDB は、追加または置換されたモジュールに関する情報のみを追加または置換し、PDB にまだ存在しない新しい型を追加することによって変更されます。
PDB ファイルは通常、プログラムの配布パッケージから削除されます。開発者はデバッグ中にこれらのファイルを使用して時間を節約し、洞察を得ます。
情報の抽出
PDB 形式についてはここで説明されており、 Microsoft Windowsで利用可能な DIA (Debug Interface Access) インターフェイスを使用して PDB ファイルから情報を抽出できます。また、 radare2や pdbparse など、PDB から情報を抽出できるサードパーティ ツールもあります。
複数のストリーム形式
PDB は、ストリームと呼ばれる複数のサブファイルから論理的に構成される単一のファイルです。コンパイルや増分リンクによって実行される PDB への変更プロセスを最適化するように設計されています。ストリームは、他のストリームを書き換えることなく削除、追加、または置換することができ、ストリームを記述するメタデータへの変更も最小限に抑えられます。
PDB は、通常 1K、2K、または 4K の固定サイズのページで構成され、0 から始まる連続番号が付けられます。
注: すべての数値情報 (ストリーム番号やページ番号など) は、Intel x86 ベースのプロセッサのネイティブ形式であるリトルエンディアン形式で保存されているものと想定されています。pdbparse Python コードでは、この前提が採用されています。
ストリーム
PDB 内の各ストリームは複数のページを占有しますが、必ずしも連続した番号が付けられているわけではありません。ストリームには番号と長さがあります。ストリーム コンテンツは、ストリームの長さに切り捨てられたページを連結したものです。
メタデータ形式
PDB メタデータの機能は、すべてのコンポーネント ストリームを識別し、各ストリームの長さとページ シーケンスを提供することです。ストリームには 0 から始まる連続番号が付けられます。また、番号が付けられていないルート ストリームもあり、これにはメタデータの一部が含まれます。
ヘッダ
PDB は、次の内容で構成されるヘッダーで始まります。
- 署名は、特定の形式を識別および検証するために使用されます。署名の長さは、特定の形式によって異なります。
- ヘッダーの残りの部分は、署名によって識別される形式によって異なります。
ヘッダーは 1 ページより長くなる場合があります。
Microsoft ツールでは、次の 2 つの PDB 形式が使用されます。
バージョン2
署名は"Microsoft C/C++ program database 2.00\r\n\032JG\0\0"(44バイト)です。
ヘッダーの残りの部分は次のものから構成されます。
- ページ サイズ、4 バイト。
- 開始ページ、2 バイト。
- ファイル ページ数 (2 バイト)。
- ルート ストリームのサイズ、4 バイト。
- 予約済み、4 バイト。
- ルート ストリーム ページ番号リスト。ページあたり 2 バイトで、上記のルート ストリーム サイズをカバーするのに十分です。
バージョン 7
署名は"Microsoft C/C++ MSF 7.00\r\n\x1ADS\0\0\0"(32バイト)です。
ヘッダーの残りの部分は次のものから構成されます。
- ページ サイズ、4 バイト。
- 割り当てテーブル ポインター、4 バイト。この意味は不明です。PDB の末尾に、65,536 ビット (8,192 バイト) の配列である割り当てテーブルがあるようです。1 ビットは使用されていないページを意味します。
- ファイル ページ数 (4 バイト)。
- ルート ストリームのサイズ、4 バイト。
- 予約済み、4 バイト。
- ルート ストリーム ページ番号リストのページ番号。これはルート ストリーム自体の場所を示すものではなく、そのページを指す構造を含むページのみを示します。そのページで、ルート ストリーム ページ番号リストはルート ストリームが格納されているページを示します。これはページごとに 4 バイトを含み、上記のルート ストリーム サイズをカバーするのに十分です。
ルートストリーム
ルート ストリームは、ストリーム 0 から始まるすべての PDB ストリームを記述します。その内容は、PDB 形式のバージョンによって異なります。
バージョン2
ルート ストリームは次の要素で構成されます。
- ストリーム数、2 バイト。
- 予約済み、2 バイト。
- 各ストリームについて:
- ストリーム サイズ、4 バイト。
- 予約済み、4 バイト。
- 各ストリームについて:
- ストリーム ページ番号リスト。ページあたり 2 バイトで、上記のストリーム サイズをカバーするのに十分です。
バージョン 7
ルート ストリームは次の要素で構成されます。
- ストリーム数、4 バイト。
- 各ストリームについて:
- ストリーム サイズ、4 バイト。
- 各ストリームについて:
- ストリーム ページ番号リスト。ページあたり 4 バイトで、上記のストリーム サイズをカバーするのに十分です。
ストリームコンテンツ
Microsoft ツールは、異なる番号のストリームにさまざまな種類の情報を格納します。一部のストリーム番号には固定の情報タイプが関連付けられており、その他のストリームは前述の固定タイプのストリームで識別されます。
ストリーム 1 は、 PDB が実行可能ファイルまたはオブジェクト ファイル ストリームで参照されるファイルと同じであることを確認するために使用されます。
- バージョン、4 バイト。
- タイム デート スタンプ、4 バイト。
- 経過時間、4 バイト。これは、この PDB が作成以降に変更された回数です。
- GUID、16 バイト。
- 後続の名前の合計長さは 4 バイトです。その後に null で終了する文字列が続きます。
ストリーム 2とストリーム 4 には、型情報が保持されます。実際の型レコードは、プログラムで使用される型を定義します。これらのレコードの構造は、Microsoft が提供するファイル cvinfo.h にあります。レコードには 2 つの種類があり、それぞれに独自のインデックス番号セット (型 ID と型) があります。ストリーム 2 には型のみが格納され、ストリーム 4 には型 ID のみが格納されます。インデックスは、シンボル レコードや他の型レコード内からこれらのレコードを参照するために使用されます。
- ヘッダー:
- バージョン、4 バイト。
- ヘッダー サイズ、4 バイト。
- タイプ レコードの最小および最大 (最後の + 1) インデックス (それぞれ 4 バイト)。
- ストリームの最後まで続くデータのサイズ(4 バイト)。
- ハッシュ情報:
- ストリーム番号、2 バイト、パディング 2 バイト。
- ハッシュ キー、4 バイト。
- バケット、4 バイト。
- HashVals、TiOff、および HashAdj は、それぞれ 4 バイトのオフセットと長さで構成されます。
- レコードを入力し、長さは可変、カウントは上記のヘッダーから (最大 - 最小) です。
ストリーム3は他のストリームのディレクトリです。バージョン2やコンパイラによって生成されたPDBには存在しません。ストリームは合計64バイトになるようにパディングされたヘッダーで始まります。
- モジュール情報、可変長。上記ヘッダーの合計サイズ。リンカーが使用するオブジェクトモジュールごとに1つずつあります。
- 開かれました、4 バイト。
- シンボル情報。
- セクション番号、2 バイト + 2 バイトのパディング。
- オフセットとサイズはそれぞれ 4 バイトです。
- フラグ、4 バイト。
- モジュール番号、2 バイト + 2 バイトのパディング。
- セクション データと再配置データの CRC (それぞれ 4 バイト)。
- フラグ、2 バイト。
- ストリーム番号、2 バイト。
- シンボルのサイズは 4 バイトです。
- 古い行番号情報と新しい行番号情報のサイズはそれぞれ 4 バイトです。
- ソース ファイルの数、2 バイト + 2 バイトのパディング。
- オフセット、4 バイト。
- niSource と niCompiler、それぞれ 4 バイト。
- モジュール名、ヌル終了バイト文字列。
- オブジェクト名、ヌル終了バイト文字列。
- 4 バイトの倍数にパディングします。
- セクションの貢献、セクション ヘッダー、ファイル情報、ts マップ、および EC 情報。それらのサイズは上記のヘッダーに記載されています。
- デバッグヘッダー、
- 古いフレーム ポインターの省略、例外、フィックスアップ、ソースとの間のオブジェクト マップ、セクション ヘッダー、トークン リング ID、Xdata、Pdata、新しいフレーム ポインターの省略、およびセクション ヘッダーのオリジンのストリーム番号。それぞれ 2 バイト。
参照
外部リンク
- PDB 形式については、PDB 形式に関する Microsoft からの情報で説明されています。
- DIA に関する Microsoft MSDN ドキュメント
- プログラム データベース (PDB) ファイルの内容を検査する方法
- シンボルとシンボル ファイル、MSDN
- PDB ファイルの内容 / Visual C++ チーム ブログ
- LLVMによるPDB構造
