次の方法で共有


Linux のシンボルとソース

この記事では、WinDbg が標準の Linux シンボルとソースをサポートする方法について説明します。 Linux でのデバッグのサポートには、WinDbg バージョン 1.2402.24001.0 以降が必要です。

DebugInfoD シンボル サーバー

ウィンドウ デバッガーでは、Linux 用のビルド成果物の自動ダウンロードに DebugInfoD 標準が使用されます。 比較すると、DebugInfoD は、Microsoft のシンボル サーバーテクノロジとソース サーバー テクノロジの組み合わせです。 ビルド ID に基づいて、3 つの成果物の種類 (実行可能ファイル (ELF)、デバッグ情報 (DWARF)、ソース (コード) を自動的にダウンロードできます。Linux のさまざまなディストリビューションで、成果物の種類の一部を提供する独自の DebugInfoD サーバーがホストされるようになりました。 さまざまな DebugInfoD サーバーが ELFUTILS https://debuginfod.elfutils.orgに記載されています。

DebugInfoD に関する一般的な情報については、以下を参照してください。

DebugInfoD* タグは 1 つ以上の DebugInfoD サーバーを指すことができ、各サーバー URL は https://domain.com でフォーマットされ、 *で区切られます。 サーバーはソース パスにリストされているのと同じ順序で検索され、最初に一致した URL からファイルが取得されます。

たとえば、次のようにシンボル パスを設定できます。

.sympath+ DebugInfoD*https://debuginfod.elfutils.org

このコマンドを !sym noisy 使用して、シンボルの読み込みに関する情報を表示します。 詳細については !symを参照してください。

ソース パス コマンド (.srcpath、.lsrcpath (ソース パスの設定)) では DebugInfoD* タグを使用して DebugInfoD サーバーからファイルを取得できます。これにより、ソース コード成果物を取得できます。 たとえば、次のようにソース パスを設定できます。

.srcpath+ DebugInfoD*https://debuginfod.elfutils.org

詳細については、「 ソース コードの拡張アクセス」を参照してください。

DWARF シンボル

DWARF は、広く使用されている標準化されたデバッグ データ形式です。 DWARF はもともと、実行可能ファイルと Linkable Format (ELF) と共に設計されていましたが、オブジェクト ファイル形式には依存しません。 詳細については、バージョン 5 標準の DWARF バージョン 5 を参照 https://en.wikipedia.org/wiki/DWARF してください。

オブジェクト・ダンプ・コマンドを使用して、DWARF シンボルのバージョンを判別します。 この例では、バージョン 5.

bob@BOB:/mnt/c/Users/BOB$ objdump -g DisplayGreeting | grep -A 2 'Compilation Unit @'
  Compilation Unit @ offset 0x0:
   Length:        0x285c (32-bit)
   Version:       5

WinDbg DWARF のサポート

WinDbg では、DWARF と ELF の次の用途がサポートされています。

  • Linux ユーザー モード - Linux ELF コア ダンプ (-z <core dump>) を開き、完全なプライベート DWARF シンボルを使用して事後デバッグと分析を実行します。

  • Linux カーネル モード - Linux カーネル (ELF VMCORE) ダンプを開き、完全なプライベート DWARF シンボルを使用して事後デバッグと分析を実行します。

  • Linux カーネル モード - Linux カーネル圧縮 KDUMP を開き、完全なプライベート DWARF シンボルを使用した事後デバッグと分析を実行します (WinDbg では ZLIB 圧縮 KDUMP ファイルのみがサポートされます。LZO および Snappy 圧縮 KDUMP はサポートされていません。

  • ELF イメージ (-z <ELF image>) を開き、内容の確認、逆アセンブルなどを行います。

  • その他の シナリオ - 混合 PE/ELF 環境での ELF イメージと DWARF シンボルについて (例: Windows に読み込まれた Open Enclave コンポーネントのデバッグ。詳細については、「 オープンエンクレーブのデバッグ (エンクレーブ デバッグを開く)」を参照してください)。

WinDbg GDBServer Linux のサポート

Linux では、WinDbg 接続をサポートするために GNU デバッガ、GDBServer が使用されます。 GDBServer の詳細については、「 https://en.wikipedia.org/wiki/Gdbserver」を参照してください。 リモート gdb デバッグのドキュメントを表示する 1 つの場所は次のとおりです。 https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging

WinDbg での GDBServer の使用およびコード ウォークスルーの詳細については Linux ライブ リモート プロセス デバッグを参照してください。 ここの例では、Linux 用 Windows サブシステム(WSL) で実行される Ubuntu を使用していますが、他の Linux 実装も使用できます。

DWARF の実装

DWARF シンボルは、元のイメージ (デバッグ バイナリ) に埋め込まれるか、別の ELF イメージ (デバッグ パッケージ) に取り除かれます。

Linux DWARF スタック ウォークを成功させるには、Linux プロセスに読み込まれたモジュールの元のバイナリ イメージが見つかる必要があります。

DWARF シンボル/ELF イメージ (削除されたかどうか) は、デバッガーの同調またはシンボル サーバー (GNU ビルド ID ハッシュを介して .NET Core に従ってインデックス付け) を介して見つけることができます。

DWARF シンボルは、Linux スタイルのデバッグ パッケージ インストールを使用して見つけることができます。 これは、シンボル パスに名前が付けられた .build-id ディレクトリによって与えられます。 この下には、GNU ビルド ID ハッシュの最初のバイトに従って名前が付けられたディレクトリがあります。 このような各ディレクトリの下には <remaining 18 bytes of GNU Build ID hash>.debug という名前 のファイルがあります。

デバッガーが DWARF シンボルを開くと、形式自体に必要な参照テーブルが含まれていないため、最初のインデックス作成手順が実行されます。 DWARF シンボルの大規模なセット (Linux カーネルのプライベート DWARF 情報など) の場合、これには 10 ~ 30 秒かかる場合があります。

既知のリポジトリ/コミットからの自動ソース取得のための !addsourcemap

既知のリポジトリからビルドされたコンポーネントをデバッグする場合は、拡張機能があります。デバッガー コマンドを使用すると、 !addsourcemap特定のモジュールとパスについて、既知の URL からソースを自動的に取得することをデバッガーに伝えることができます。 拡張機能の使用方法は次のとおりです。

!addsourcemap <module> <local spec> <remote spec>

ここで:

<module> は対象となるモジュールの名前です。

<local spec> は、URL を介して検索される、そのモジュール内のソースのパスです。 このパスは、野生のカードで終わる必要があります。

<remote spec><local spec> 一致 するファイルが検索される URL です。 このパスはワイルドで終わる必要がありますカードこれは、wildカード が特定のソース パスと一致する方法に <local spec> 置き換えられます。

ソースマップを設定するには lm (ロードされたモジュールの一覧表示) を使用してモジュールが存在することを確認します。 次に、ソースのリモートの場所を決定します。

この例では、vmlinux モジュールを GitHub で使用できる特定のビルドに設定します。

0:000> !addsourcemap vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
Source map /build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/ successfully added

sourcemap コマンドが発行されると、.reload コマンドを使用して、フレームの前後の切り替えや再読み込みなど、さまざまなことがソースの読み込みをトリガーします。 その後、GitHub からの自動ソース プルが行われます。

!sourcemaps

コマンドを使用して、既存の !sourcemaps ソース マップを一覧表示します。

0:000> !sourcemaps
Source maps for vmlinux.6:
    /build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/

!removesourcemaps

コマンドを !removesourcemaps 使用して、既存のソース マップを削除します。

0:000> !removesourcemaps vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
1 source maps successfully removed

DWARF シンボルのトラブルシューティング

Linux/Android ダンプ (または DWARF シンボルを使用するその他のターゲット) をデバッグする場合は、シンボルの生の内容を確認して、ローカル変数、型定義、または関数定義が正しくない理由を理解することができます。 これを行うために、デバッガーには、DWARF シンボルの生の内容をダンプする拡張機能コマンドがいくつか組み込まれています。 さらに、readelf や dumpdwarf などの Linux ユーティリティを使用して、シンボル内部情報を表示します。

readelf コマンド

Linux コマンド プロンプトで readelf コマンドを使用して Linux ライブ リモート プロセス デバッグで作成されたサンプル DisplayGreeting プログラム用に 作成されたデバッグ ビルド ID を表示します。 この例では aba822dd158b997b09903d4165f3dbfd37f5e5c1 のビルド ID が返されます。

Bob@BOB6:/mnt/c/Users/Bob$ readelf -n DisplayGreeting

Displaying notes found in: .note.gnu.property
  Owner                Data size        Description
  GNU                  0x00000020       NT_GNU_PROPERTY_TYPE_0
      Properties: x86 feature: IBT, SHSTK
        x86 ISA needed: x86-64-baseline

Displaying notes found in: .note.gnu.build-id
  Owner                Data size        Description
  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: aba822dd158b997b09903d4165f3dbfd37f5e5c1

Displaying notes found in: .note.ABI-tag
  Owner                Data size        Description
  GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)
    OS: Linux, ABI: 3.2.0

Readelf を grep と共に使用してシンボル バージョンを返すことができます。

 readelf --debug-dump=info DisplayGreeting | grep -A 2 'Compilation Unit @'
  Compilation Unit @ offset 0x0:
   Length:        0x285c (32-bit)
   Version:       5

dwarfdump

dwarfdump linux コマンドは、特定のオプションによって要求された DWARF セクションを出力またはチェックします。 dwarfdump -h を使用して、多くのオプションを表示します。

bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -h

Ubuntu での dwarfdump の使用の詳細については dwarfdump に関するページを参照してください。

!diesym

このデバッガー コマンドは、指定された式 (アドレス、関数名など) にあるシンボルの DIE (または DIE サブツリー) を、必要に応じて指定された再帰レベルで表示します。 指定されたアドレスに含まれるシンボル (通常は関数ですが、データなど) の DIE を検索し、シンボルで dwarfdump または llvm-dwarfdump を実行し、DIE を見つけるのと同様に、DIE の診断ダンプを実行します。

!diesym [options] <expression>

-r# : N レベルを再帰的にダンプします。 通常、これは 1 つであり、DIE 自体のみがダンプされます。

<expression> - DIE を検索するアドレスは、式によって指定されます。 フラットな 16 進アドレス (0x<blah>) でも、それ以外の場合は一意の関数名でもかまいません。

これは、データ モデルの標準評価によって評価できる必要があります。 dx コマンドを使用して、モデル式を検証します。 dx コマンドの使用方法の詳細については、「 dx (デバッガー オブジェクト モデル式の表示)」を参照してください。

0:000> dx DisplayGreeting!GetCppConGreeting
DisplayGreeting!GetCppConGreeting                 : DisplayGreeting!GetCppConGreeting+0x0 [Type: GetCppConGreeting]

サンプルの DisplayGreeting プログラム GetCppConGreeting 関数の DIE シンボル情報を表示します。

0:000> !diesym DisplayGreeting!GetCppConGreeting
0x2816: DW_TAG_subprogram [^^^]
    DW_AT_external          (true)
    DW_AT_name              'GetCppConGreeting'
    DW_AT_decl_file         1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
    DW_AT_decl_line         0x7
    DW_AT_decl_column       0x6
    DW_AT_linkage_name      '_Z17GetCppConGreetingPwm'
    DW_AT_low_pc            0x11E9
    DW_AT_high_pc           +0x3c (== 0x1225)
    DW_AT_frame_base        DW_OP_call_frame_cfa 
    DW_AT_call_all_tail_calls   (true)

追加レベルの DIE シンボル情報を表示するには、-r2 オプションを使用します。

0:000> !diesym -r2 DisplayGreeting!GetCppConGreeting
0x2816: DW_TAG_subprogram [^^^]
    DW_AT_external          (true)
    DW_AT_name              'GetCppConGreeting'
    DW_AT_decl_file         1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
    DW_AT_decl_line         0x7
    DW_AT_decl_column       0x6
    DW_AT_linkage_name      '_Z17GetCppConGreetingPwm'
    DW_AT_low_pc            0x11E9
    DW_AT_high_pc           +0x3c (== 0x1225)
    DW_AT_frame_base        DW_OP_call_frame_cfa 
    DW_AT_call_all_tail_calls   (true)

    0x2834: DW_TAG_formal_parameter [^^^]
        DW_AT_name              'buffer'
        DW_AT_decl_file         1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
        DW_AT_decl_line         0x7
        DW_AT_decl_column       0x21
        DW_AT_type              (CU + 0x12f7 == 0x12f7)
        DW_AT_location          DW_OP_fbreg(-40) 

!die

!die は、DWARF デバッグ セクション内の指定されたオフセット式にある任意の DIE の DIE (または DIE サブツリー) を、必要に応じて指定された再帰レベルで表示します。

!die [-r#] [-t] -m <module base expression> <offset expression>

-r# : N レベルを再帰的にダンプします。

-t : DIE が.debug_info内のコンパイル単位ではなく、.debug_typesの型単位内にある場合は、-t スイッチを指定する必要があります。

クエリ対象 -m <module base expression> のモジュールのベース アドレスを指定します。

DIE <offset expression> オフセットのサイズを指定します。

Linux プロンプトで、-r と共に dwarfdump を使用して DWARF ファイルの .debug_aranges セクションを出力し、DIE オフセットを見つけます。

bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -r DisplayGreeting

.debug_aranges

COMPILE_UNIT<header overall offset = 0x00000000>:
< 0><0x0000000c>  DW_TAG_compile_unit
                    DW_AT_producer              GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection
                    DW_AT_language              DW_LANG_C_plus_plus_14
                    DW_AT_name                  DisplayGreeting.cpp
                    DW_AT_comp_dir              /mnt/c/Users/BOB
                    DW_AT_ranges                0x0000000c

      Offset of rnglists entries: 0x0000000c
      [ 0] start,end             0x000011e9 0x0000134a
      [ 1] start,end             0x0000134a 0x00001368
      [ 2] start,end             0x00001368 0x0000137b
      [ 3] start,end             0x0000137b 0x0000138d
      [ 4] end of list
                    DW_AT_low_pc                0x00000000
                    DW_AT_stmt_list             0x00000000


arange starts at 0x000011e9, length of 0x00000161, cu_die_offset = 0x0000000c
arange starts at 0x0000134a, length of 0x0000001e, cu_die_offset = 0x0000000c
arange starts at 0x00001368, length of 0x00000013, cu_die_offset = 0x0000000c
arange starts at 0x0000137b, length of 0x00000012, cu_die_offset = 0x0000000c

のDW_AT_ranges値に 0x0000000c注意してください。 デバッガーでは、そのオフセット値と DisplayGreeting のモジュール名を使用して DIE シンボル情報を表示します。

0:000> !die -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
    DW_AT_producer          'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
    DW_AT_language          0x21
    DW_AT_name              
    DW_AT_comp_dir          
    DW_AT_ranges            
        [0x11e9 - 0x134a)
        [0x134a - 0x1368)
        [0x1368 - 0x137b)
        [0x137b - 0x138d)
    DW_AT_low_pc            0x0
    DW_AT_stmt_list        

!dieancestry

!dieancestry コマンドは !die と同様に動作しますが、ツリーを下るのではなく、含まれているコンパイルまたはタイプ ユニットに向かって DIE ツリーを上っていきます。

!dieancestry [-r#] [-t] -m <module base expression> <offset expression>

-r# : N レベルを再帰的にダンプします。

クエリ対象 -m <module base expression> のモジュールのベース アドレスを指定します。

DIE <offset expression> オフセットのサイズを指定します。

例:

0:000> !dieancestry -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
    DW_AT_producer          'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
    DW_AT_language          0x21
    DW_AT_name              
    DW_AT_comp_dir          
    DW_AT_ranges            
        [0x11e9 - 0x134a)
        [0x134a - 0x1368)
        [0x1368 - 0x137b)
        [0x137b - 0x138d)
    DW_AT_low_pc            0x0
    DW_AT_stmt_list       

親や兄弟へのリンクはクリック可能であり、DWARF シンボル ツリーをさらに走査できます。

0:000> !die -r2 -m 0x555555554000 0xc
0xc: DW_TAG_compile_unit [^^^]
    DW_AT_producer          'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
    DW_AT_language          0x21
    DW_AT_name              
    DW_AT_comp_dir          
    DW_AT_ranges            
        [0x11e9 - 0x134a)
        [0x134a - 0x1368)
        [0x1368 - 0x137b)
        [0x137b - 0x138d)
    DW_AT_low_pc            0x0
    DW_AT_stmt_list         

    0x2a: DW_TAG_namespace [^^^]
        DW_AT_name              'std'
        DW_AT_decl_file         9 ('/usr/include/c++/11/bits/exception_ptr.h')
        DW_AT_decl_line         0x116
        DW_AT_decl_column       0xb
        DW_AT_sibling           (CU + 0xf01 == 0xf01)

    0xf01: DW_TAG_base_type [^^^]
        DW_AT_byte_size         0x1
        DW_AT_encoding          DW_ATE_boolean (2)
        DW_AT_name              'bool'

    0xf08: DW_TAG_base_type [^^^]
        DW_AT_byte_size         0x8
        DW_AT_encoding          DW_ATE_unsigned (7)
        DW_AT_name              'long unsigned int'

...
   

すべての出力が表示されるわけではありません。

!dwunwind

!dwunwind は、PE イメージの .fnent (関数データの表示) にやや似ています。 式によって指定されたアドレスの DWARF アンワインド ルールが表示されます。 また、readelf --unwind コマンドに似ています。アンワインド情報が表示されます(使用可能な場合)。

!dwunwind <expression>

次の使用例は、DisplayGreeting プログラムの GetCppConGreeting 関数のアンワインド ルールを表示します。

0:000> !dwunwind DisplayGreeting!GetCppConGreeting
DW_FRAME_SAME_VAL: 0('rax'), 1('rdx'), 2('rcx'), 3('rbx'), 4('rsi'), 5('rdi'), 6('rbp'), 7('rsp'), 8('r8'), 9('r9'), 10('r10'), 11('r11'), 12('r12'), 13('r13'), 14('r14'), 15('r15')
0('CFA'): DW_EXPR_OFFSET 7('rsp') + 8
16('<Return Address>'): DW_EXPR_OFFSET 12290('CFA') + -8

これにより、命令ポインター レジスタのアンワインド スタックが表示されます。

0:000> !dwunwind @rip
DW_FRAME_SAME_VAL: 0('rax'), 1('rdx'), 2('rcx'), 4('rsi'), 5('rdi'), 7('rsp'), 8('r8'), 9('r9'), 10('r10'), 11('r11'), 14('r14'), 15('r15')
0('CFA'): DW_EXPR_OFFSET 7('rsp') + 208
3('rbx'): DW_EXPR_OFFSET 12290('CFA') + -40
6('rbp'): DW_EXPR_OFFSET 12290('CFA') + -32
12('r12'): DW_EXPR_OFFSET 12290('CFA') + -24
13('r13'): DW_EXPR_OFFSET 12290('CFA') + -16
16('<Return Address>'): DW_EXPR_OFFSET 12290('CFA') + -8

プログラム カウンターの例を次に示します。

   0:000> !dwunwind @pc
   DW_FRAME_SAME_VAL: 0('x0'), 1('x1'), 2('x2'), 3('x3'), 4('x4'), 5('x5'), 6('x6'), 7('x7'), 8('x8'), 9('x9'), 10('x10'), 11('x11'), 12('x12'), 13('x13'), 14('x14'), 15('x15'), 16('x16'), 17('x17'), 18('x18'), 31('sp'), 32('pc')
   0('CFA'): DW_EXPR_OFFSET 31('sp') + 208
   19('x19'): DW_EXPR_OFFSET 1436('CFA') + -192
   20('x20'): DW_EXPR_OFFSET 1436('CFA') + -184
   21('x21'): DW_EXPR_OFFSET 1436('CFA') + -176
   22('x22'): DW_EXPR_OFFSET 1436('CFA') + -168
   23('x23'): DW_EXPR_OFFSET 1436('CFA') + -160
   24('x24'): DW_EXPR_OFFSET 1436('CFA') + -152
   25('x25'): DW_EXPR_OFFSET 1436('CFA') + -144
   26('x26'): DW_EXPR_OFFSET 1436('CFA') + -136
   27('x27'): DW_EXPR_OFFSET 1436('CFA') + -128
   28('x28'): DW_EXPR_OFFSET 1436('CFA') + -120
   29('fp'): DW_EXPR_OFFSET 1436('CFA') + -208
   30('lr'): DW_EXPR_OFFSET 1436('CFA') + -200

!dietree

シンボルで dwarfdump または llvm-dwarfdump を実行し、DIE を見つけるのと同様に、特定の再帰レベルで特定のモジュールの DIE ツリーをダンプします。

!dietree [OPTIONS] -m <module base> <offset expression>

-r# : 再帰レベルを指定する

-t : .debug_infoではなく、.debug_typesをダンプします

DIE を含むモジュールのモジュール ベースは、オプションで -m <expression> 指定する必要があります。

DIE <offset expression> オフセットのサイズを指定します。

例:

0:000> !dietree -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
    DW_AT_producer          'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
    DW_AT_language          0x21
    DW_AT_name              
    DW_AT_comp_dir          
    DW_AT_ranges            
        [0x11e9 - 0x134a)
        [0x134a - 0x1368)
        [0x1368 - 0x137b)
        [0x137b - 0x138d)
    DW_AT_low_pc            0x0
    DW_AT_stmt_list  

-r2 オプションを使用して、ダイツリーに追加の値を表示します。

0:000> !dietree -r2 -m DisplayGreeting 0x0000000c
0xc: DW_TAG_compile_unit [^^^]
    DW_AT_producer          'GNU C++17 11.4.0 -mtune=generic -march=x86-64 -g -fasynchronous-unwind-tables -fstack-protector-strong -fstack-clash-protection -fcf-protection'
    DW_AT_language          0x21
    DW_AT_name              
    DW_AT_comp_dir          
    DW_AT_ranges            
        [0x11e9 - 0x134a)
        [0x134a - 0x1368)
        [0x1368 - 0x137b)
        [0x137b - 0x138d)
    DW_AT_low_pc            0x0
    DW_AT_stmt_list         

    0x2a: DW_TAG_namespace [^^^]
        DW_AT_name              'std'
        DW_AT_decl_file         9 ('/usr/include/c++/11/bits/exception_ptr.h')
        DW_AT_decl_line         0x116
        DW_AT_decl_column       0xb
        DW_AT_sibling           (CU + 0xf01 == 0xf01)

    0xf01: DW_TAG_base_type [^^^]
        DW_AT_byte_size         0x1
        DW_AT_encoding          DW_ATE_boolean (2)
        DW_AT_name              'bool'

    0xf08: DW_TAG_base_type [^^^]
        DW_AT_byte_size         0x8
        DW_AT_encoding          DW_ATE_unsigned (7)
        DW_AT_name              'long unsigned int'

    0xf0f: DW_TAG_base_type [^^^]
        DW_AT_byte_size         0x1
        DW_AT_encoding          DW_ATE_unsigned_char (8)
        DW_AT_name              'unsigned char'

...

すべての出力が表示されるわけではありません。 兄弟などへのリンクをクリックすると、DWARF シンボル ツリーをさらに移動できることに注意してください。

!dielocal

"name" という名前のローカル変数の DIE を検索し、シンボルで dwarfdump または llvm-dwarfdump を実行し、DIE を見つけるのと同様に、DIE の診断ダンプを実行します。

!dielocal [options] <name>

-r# : N レベルを再帰的にダンプします。 通常、これは 1 つであり、DIE 自体のみがダンプされます。

<name> : "name" という名前のローカル変数。

例:

0:000> !dielocal greeting
0x2806: DW_TAG_variable [^^^]
    DW_AT_name              'greeting'
    DW_AT_decl_file         1 ('/mnt/c/Users/BOB/DisplayGreeting.cpp')
    DW_AT_decl_line         0xf
    DW_AT_decl_column       0x1d
    DW_AT_type              (CU + 0xb18 == 0xb18)
    DW_AT_location          DW_OP_fbreg(-240) 

関連項目

ソース コードの拡張アクセス

ELFUTILS debuginfod

DWARF バージョン 5

シンボルの使用

!sym