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)