メインコンテンツまでスキップ
メインコンテンツまでスキップ

DWARF

InputOutputAlias

説明

DWARF フォーマットは ELF ファイル(実行ファイル、ライブラリ、またはオブジェクトファイル)から DWARF デバッグシンボルを解析します。 これは dwarfdump に似ていますが、はるかに高速(毎秒数百 MB)で、SQL をサポートしています。 .debug_info セクション内の各デバッグ情報エントリ (DIE) に対して 1 行を生成し、DWARF エンコーディングがツリー内の子リストを終了するために使用する「null」エントリを含みます。

参考

.debug_info はコンパイルユニットに対応する units で構成されています:

  • 各ユニットは DIE のツリーであり、compile_unit DIE がそのルートです。
  • 各 DIE には tagattributes のリストがあります。
  • 各属性には namevalue があり(また、値がどのようにエンコードされるかを指定する form もあります)。

DIE はソースコードからの要素を表しており、その tag によってそれが何の要素であるかを示します。例えば、以下のようなものがあります:

  • 関数 (tag = subprogram)
  • クラス/構造体/列挙型 (class_type/structure_type/enumeration_type)
  • 変数 (variable)
  • 関数の引数 (formal_parameter)

ツリー構造は対応するソースコードを反映しています。例えば、class_type DIE はクラスのメソッドを表す subprogram DIE を含むことができます。

DWARF フォーマットは以下のカラムを出力します:

  • offset - .debug_info セクション内の DIE の位置
  • size - エンコードされた DIE のバイト数(属性を含む)
  • tag - DIE のタイプ;通常の「DW_TAG_」接頭辞は省略されます
  • unit_name - この DIE を含むコンパイルユニットの名前
  • unit_offset - この DIE を含むコンパイルユニットが .debug_info セクション内に位置する場所
  • ancestor_tags - ツリー内の現在の DIE の先祖のタグの配列、内側から外側への順序で
  • ancestor_offsets - 先祖のオフセット、ancestor_tags に平行
  • 利便性のために属性配列から複製された一般的な属性のいくつか:
    • name
    • linkage_name - 修飾された完全修飾名;通常は関数のみが持ちます(しかし全ての関数ではありません)
    • decl_file - このエンティティが宣言されたソースコードファイルの名前
    • decl_line - このエンティティが宣言されたソースコード内の行番号
  • 属性を記述する平行配列:
    • attr_name - 属性の名前;通常の「DW_AT_」接頭辞は省略されます
    • attr_form - 属性がどのようにエンコードされ解釈されるか;通常の DW_FORM_ 接頭辞は省略されます
    • attr_int - 属性の整数値;属性が数値の値を持たない場合は 0
    • attr_str - 属性の文字列値;属性が文字列の値を持たない場合は空

使用例

DWARF フォーマットは、関数定義(テンプレートインスタンス化やインクルードされたヘッダーファイルからの関数を含む)が最も多いコンパイルユニットを見つけるために使用できます:

フォーマット設定