llvm-pdbutil - PDBファイルのフォレンジックと診断

概要

llvm-pdbutil [サブコマンド] [オプション]

説明

PDBファイルから型、シンボル、CodeViewレコード、およびその他の情報を表示し、PDBファイルを操作および作成します。llvm-pdbutilは通常、LLVMのPDBの読み書き機能をテストするためにFileCheckベースのテストで使用されますが、一般的なPDBファイルの調査やフォレンジック、またはcvdumpの代替としても使用できます。

サブコマンド

llvm-pdbutilは、それぞれ異なる目的に合わせていくつかのサブコマンドに分かれています。各コマンドの簡単な概要を以下に示し、詳細については以下のセクションで説明します。

  • pretty - シンボルと型の情報を、可能な限り元のソースコードのように見える形式でダンプします。

  • dump - CodeViewレコード、ハッシュテーブル、PDBストリームなど、PDBファイルから低レベルの型と構造をダンプします。

  • bytes - PDBファイルのストリーム、レコード、型、シンボルなどから、データを生のバイトとしてダンプします。

  • yaml2pdb - PDBファイルのyaml記述が与えられた場合、その記述に一致する有効なPDBファイルを生成します。

  • pdb2yaml - 指定されたPDBファイルについて、PDBを再構築できるように、ファイルの一部またはすべてをYAML記述で生成します。

  • merge - 2つのPDBが与えられた場合、2つの入力PDBをマージした結果である3番目のPDBを生成します。

pretty

重要

prettyサブコマンドはWindows DIA SDK上に構築されているため、Windows以外のプラットフォームではサポートされていません。

使用法: llvm-pdbutil pretty [オプション] <入力 PDB ファイル>

概要

prettyサブコマンドは、プログラムのデバッグ情報の非常に高レベルな表現を表示します。Windowsツールとデバッガーがデバッグ情報を照会する標準APIであるWindows DIA SDK上に構築されているため、低レベルのCodeViewレコードを表示するモードよりも、デバッガーがデバッグ情報をどのように解釈するかについてより信頼性の高いビューを示します。

オプション

フィルタリングとソートのオプション

excludeフィルターは、includeフィルターよりも優先されます。したがって、フィルターがincludeルールとexcludeルールの両方に一致する場合、それは除外されます。

-exclude-compilands=<文字列>

コンパイル単位、コンパイル単位のソースファイルへの貢献、またはコンパイル単位ごとのシンボルをダンプする場合、このオプションは、指定された正規表現に一致するコンパイル単位を省略するようにllvm-pdbutilに指示します。

-exclude-symbols=<文字列>

グローバルシンボル、パブリックシンボル、またはコンパイル単位ごとのシンボルをダンプする場合、このオプションは、指定された正規表現に一致するシンボルを省略するようにllvm-pdbutilに指示します。

-exclude-types=<文字列>

型をダンプする場合、このオプションは、指定された正規表現に一致する型を省略するようにllvm-pdbutilに指示します。

-include-compilands=<文字列>

コンパイル単位、コンパイル単位のソースファイルへの貢献、またはコンパイル単位ごとのシンボルをダンプする場合、指定された正規表現に一致するコンパイル単位のみに最初の検索を制限します。

-include-symbols=<文字列>

グローバルシンボル、パブリックシンボル、またはコンパイル単位ごとのシンボルをダンプする場合、指定された正規表現に一致するシンボルのみに最初の検索を制限します。

-include-types=<文字列>

型をダンプする場合、指定された正規表現に一致する型のみに最初の検索を制限します。

-min-class-padding=<uint>

ベースクラスと集約フィールドメンバーのパディングを考慮して、指定された量以上の配置パディングを持つ型のみを表示します。

-min-class-padding-imm=<uint>

ベースクラスと集約フィールドメンバーのパディングを無視して、指定された量以上の配置パディングを持つ型のみを表示します。

-min-type-size=<uint>

sizeof(T)が指定された量以上である型Tのみを表示します。

-no-compiler-generated

コンパイラーが生成した型とシンボルを表示しません

-no-enum-definitions

enumをダンプする場合、enum全体(たとえば、個々の列挙子値)を表示しません。

-no-system-libs

システムライブラリからのシンボルを表示しません

シンボル型オプション
-all

このカテゴリの他のすべてのオプションを意味します。

-class-definitions=<フォーマット>

指定された形式でクラス定義を表示します。

=all      - Display all class members including data, constants, typedefs, functions, etc (default)
=layout   - Only display members that contribute to class size.
=none     - Don't display class definitions (e.g. only display the name and base list)
-class-order

指定された順序でクラスを表示します。

=none            - Undefined / no particular sort order (default)
=name            - Sort classes by name
=size            - Sort classes by size
=padding         - Sort classes by amount of padding
=padding-pct     - Sort classes by percentage of space consumed by padding
=padding-imm     - Sort classes by amount of immediate padding
=padding-pct-imm - Sort classes by percentage of space consumed by immediate padding
-class-recurse-depth=<uint>

クラス定義をダンプするとき、指定された回数再帰した後で停止します。デフォルトは0で、制限はありません。

-classes

クラスを表示します

-compilands

コンパイル単位(例:オブジェクトファイル)を表示します

-enums

enumを表示します

-externals

外部(例:エクスポートされた)シンボルをダンプします

-globals

グローバルシンボルをダンプします

-lines

ソース行とコードアドレス間のマッピングをダンプします。

-module-syms

各コンパイル単位のシンボル(変数、関数など)を表示します

-sym-types=<型>

-globals、-externals、または-module-symsが指定されたときにダンプするシンボルの型。(デフォルトはすべて)

=thunks - Display thunk symbols
=data   - Display data symbols
=funcs  - Display function symbols
=all    - Display all symbols (default)
-symbol-order=<順序>

-module-syms、-globals、または-externalsオプションでダンプされたシンボルについて、指定された順序で結果をソートします。

=none - Undefined / no particular sort order
=name - Sort symbols by name
=size - Sort symbols by size
-typedefs

typedef型を表示します

-types

すべての型を表示します(-classes、-enums、-typedefsを意味します)

その他のオプション
-color-output

カラー出力を強制的にオンまたはオフにします。デフォルトでは、端末に出力する場合、カラーが使用されます。

-load-address=<uint>

相対仮想アドレスを表示する際、プロセスが指定されたアドレスにロードされていると仮定し、絶対アドレスを表示します。

dump

使用法: llvm-pdbutil dump [オプション] <入力 PDB ファイル>

概要

dump サブコマンドは、PDB ファイルの構造に関する低レベルの情報を表示します。これは LLVM のテストインフラストラクチャで多用されますが、PDB フォレンジックにも使用できます。Microsoft の cvdump ツールと同様の役割を果たします。

dump サブコマンドは、ファイル形式の内部詳細を公開します。そのため、このコマンドを使用する前に、PDB ファイル形式 に精通している必要があります。

オプション

MSF コンテナオプション
-streams

PDB ファイル内のすべてのストリームの概要をダンプします。

-stream-blocks

-streams と組み合わせて、指定されたストリームが占有するブロックに関する情報を出力に追加します。

-summary

MSF および PDB ヘッダー情報をダンプします。

モジュール & ファイルオプション
-modi=<uint>

各モジュール/コンパイル単位から情報をダンプするすべてのオプションについて、指定されたモジュールに制限します。

-files

表示される各モジュールに寄与するソースファイルをダンプします。

-il

インライン化された行情報をダンプします (DEBUG_S_INLINEELINES CodeView サブセクション)。

-l

行情報(DEBUG_S_LINES CodeView サブセクション)をダンプします。

-modules

コンパイル単位情報をダンプします。

-xme

クロスモジュールエクスポート (DEBUG_S_CROSSSCOPEEXPORTS CodeView サブセクション) をダンプします。

-xmi

クロスモジュールインポート (DEBUG_S_CROSSSCOPEIMPORTS CodeView サブセクション) をダンプします。

シンボルオプション
-globals

グローバルシンボルレコードをダンプします。

-global-extras

ハッシュバケットやハッシュ値など、グローバルに関する追加情報をダンプします。

-publics

パブリックシンボルレコードをダンプします。

-public-extras

ハッシュバケットやハッシュ値など、パブリックに関する追加情報をダンプします。

-symbols

ダンプされた各モジュールのシンボル(関数、変数など)をダンプします。

-sym-data

-symbols オプションの結果としてダンプされた各シンボルレコードについて、レコードの完全なバイトをバイナリでも表示します。

型レコードオプション
-types

TPI ストリームから CodeView 型レコードをダンプします。

-type-extras

ハッシュや型インデックスオフセット配列など、TPI ストリームからの追加情報をダンプします。

-type-data

ダンプされた各型レコードについて、レコードの完全なバイトをバイナリでも表示します。

-type-index=<uint>

指定された型インデックスを持つ型のみをダンプします。

-ids

IPI ストリームから CodeView 型レコードをダンプします。

-id-extras

ハッシュや型インデックスオフセット配列など、IPI ストリームからの追加情報をダンプします。

-id-data

ダンプされた各 ID レコードについて、レコードの完全なバイトをバイナリでも表示します。

-id-index=<uint>

指定された16進数の型インデックスを持つ ID レコードのみをダンプします。

-dependents

-type-index または -id-index と組み合わせて使用すると、指定されたインデックスを持つ単一のレコードだけでなく、指定されたインデックスの依存関係グラフ全体をダンプします。たとえば、型インデックス 0x4000 が戻り値の型がインデックス 0x3000 の関数であり、-dependents=0x4000 を指定した場合、両方のレコード(およびツリー内の他の依存レコード)をダンプします。

その他のオプション
-all

他のほとんどのオプションを暗示します。

-section-contribs

セクションコントリビューションをダンプします。

-section-headers

イメージセクションヘッダーをダンプします。

-section-map

セクションマップをダンプします。

-string-table

PDB 文字列テーブルをダンプします。

bytes

使用法: llvm-pdbutil bytes [オプション] <入力 PDB ファイル>

概要

dump サブコマンドと同様に、bytes サブコマンドは PDB ファイルの構造に関する低レベルの情報を表示しますが、より深いフォレンジックに使用されます。bytes サブコマンドは、指定されたコマンドラインオプションに基づいて PDB ファイル内のさまざまな構造を検索し、それらを16進数でダンプします。たとえば、PDB の出力のサポートに取り組んでいる人は、ある PDB を別の PDB と比較して、バイト単位の互換性を確保するために、このサブコマンドを多用するでしょう。ファイル全体またはストリーム全体のバイトを単純に比較するだけでは十分ではありません。なぜなら、同じ構造が2つの異なる PDB の異なる場所に存在してもまったく問題なく、「構造を見つける」ことが半分手間だからです。

オプション

MSF ファイルオプション
-block-range=<start[-end]>

MSF ファイルブロックの指定された範囲からバイナリデータをダンプします。

-byte-range=<start[-end]>

ファイル内の指定された範囲のバイトからバイナリデータをダンプします。

-fpm

MSF 空きページマップをダンプします。

-stream-data=<string>

指定されたストリームからバイナリデータをダンプします。形式は SN[:Start][@Size] です。たとえば、-stream-data=7:3@12 は、ストリーム 7 のオフセット 3 から始まる 12 バイトをダンプします。

PDB ストリームオプション
-name-map

PDB ネームマップのバイトをダンプします。

DBIストリームオプション
-ec

DBIストリームの編集と継続マップのサブストリームをダンプします。

-files

DBIストリームのファイル情報サブストリームをダンプします。

-modi

DBIストリームのmodiサブストリームをダンプします。

-sc

DBIストリームのセクション貢献サブストリームをダンプします。

-sm

DBIストリームからセクションマップをダンプします。

-type-server

DBIストリームから型サーバーマップをダンプします。

モジュールオプション
-mod=<uint>

このカテゴリのすべてのオプションを、指定されたモジュールインデックスに制限します。デフォルトでは、このカテゴリのオプションは、すべてのモジュールからバイトをダンプします。

-chunks

各モジュールのC13デバッグサブセクションのバイトをダンプします。

-split-chunks

-chunksと合わせて指定すると、C13デバッグサブセクションをサブセクションタイプごとに個別のチャンクに分割し、それぞれを個別にダンプします。

-syms

各モジュールからシンボルレコードサブストリームをダンプします。

型レコードオプション
-id=<uint>

指定された型インデックスを持つIPIストリームからレコードをダンプします。

-type=<uint>

指定された型インデックスを持つTPIストリームからレコードをダンプします。

pdb2yaml

使用法: llvm-pdbutil pdb2yaml [オプション] <入力 PDB ファイル>

概要

オプション

yaml2pdb

使用法: llvm-pdbutil yaml2pdb [オプション] <入力 YAML ファイル>

概要

YAML記述からPDBファイルを生成します。YAML構文についてはここでは説明しません。代わりに、llvm-pdbutil pdb2yamlを使用し、出力例を起点として調べてください。

オプション

-pdb=<ファイル名>

結果のPDBを指定されたファイルに書き込みます。

merge

使用法: llvm-pdbutil merge [オプション] <入力 PDB ファイル 1> <入力 PDB ファイル 2>

概要

2つのPDBファイルを1つのファイルにマージします。

オプション

-pdb=<ファイル名>

結果のPDBを指定されたファイルに書き込みます。