Symboly a zdroje Linuxu
Tento článek popisuje, jak WinDbg podporuje standardní linuxové symboly a zdroje. Podpora ladění v Linuxu vyžaduje WinDbg verze 1.2402.24001.0 nebo vyšší.
Servery symbolů DebugInfoD
Ladicí program Windows používá standard DebugInfoD pro automatické stahování artefaktů sestavení pro Linux. DebugInfoD je podobně kombinací Microsoftových technologií symbolového serveru a zdrojového serveru. Umožňuje automatické stahování tří typů artefaktů (spustitelných souborů (ELF), informací o ladění (DWARF) a zdrojového kódu (kód) podle ID sestavení). Různé distribuce Linuxu nyní hostují vlastní servery DebugInfoD, které poskytují některé typy artefaktů. Různé servery DebugInfoD jsou uvedeny v ELFUTILS https://debuginfod.elfutils.org.
Obecné informace o debugInfoD jsou k dispozici zde:
Značka DebugInfoD*
může odkazovat na jeden nebo více serverů DebugInfoD, přičemž URL každého serveru je formátována jako https://domain.com
a oddělená *
. Servery budou prohledány ve stejném pořadí jako ve zdrojové cestě a soubory se načtou z první odpovídající adresy URL.
Můžete například nastavit cestu symbolu takto.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Pomocí příkazu !sym noisy
zobrazte informace o načítání symbolů. Další informace naleznete v tématu !sym.
Příkaz zdrojové cesty (.srcpath, .lsrcpath (Nastavit zdrojovou cestu)) podporuje načítání souborů ze serverů DebugInfoD prostřednictvím značky DebugInfoD*
, která umožňuje načtení artefaktů zdrojového kódu. Můžete například nastavit zdrojovou cestu, jako je tato.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Další informace naleznete v části Rozšířený přístup ke zdrojovému kódu.
SYMBOLY TRPASLÍKU
DWARF je široce používaný, standardizovaný ladicí formát dat. TRPASLÍK byl původně navržen spolu s formátem ELF, ačkoli je nezávislý na formátech objektových souborů. Další informace naleznete v tématu https://en.wikipedia.org/wiki/DWARF a pro standard verze 5 se podívejte na DWARF verze 5.
Použijte příkaz objektového výpisu k určení verze symbolu DWARF. V tomto příkladu je verze 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
Podpora WinDbg pro DWARF
WinDbg podporuje následující použití TRPASLÍKu a ELF.
Linuxový uživatelský režim – otevírání výpisů paměti Linux ELF Core (
-z <core dump>
) a provádění post-mortem ladění a analýzy s úplnými privátními symboly DWARF.režim kernelu Linuxu – otevírání výpisů jádra Linuxu (ELF VMCORE) a provádění post-mortem ladění a analýzy s úplnými privátními symboly DWARF.
Linuxového režimu jádra – Otevření komprimovaných KDUMPů jádra Linuxu a následné ladění a analýza pomocí úplných privátních symbolů DWARF (WinDbg podporuje pouze ZLIB komprimované soubory KDUMP. Soubory KDUMP komprimované pomocí LZO a Snappy nejsou podporovány.)
Otevírání obrázků ELF (
-z <ELF image>
) a zkoumání obsahu, demontáže atd.Další scénáře – Pochopení obrázků ELF a symbolů trpaslíka ve smíšených prostředích PE/ELF (např. ladění komponent Open Enclave načtených v systému Windows. Další informace najdete v tématu ladění Open Enclave.)
Podpora WinDbg GDBServer pro Linux
Gnu Debugger, GDBServer se používá v Linuxu k podpoře připojení WinDbg. Další informace o GDBServer naleznete v tématu https://en.wikipedia.org/wiki/Gdbserver. Tady je jedno místo pro zobrazení dokumentace pro vzdálené ladění gdb – https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging
Další informace o použití GDBServer s WinDbg a návod kódu najdete v tématu ladění vzdáleného procesu v Linuxu za provozu. Zde uvedené příklady používají Ubuntu běžící pod subsystémem Windows pro Linux (WSL), ale je možné použít i jiné implementace Linuxu.
IMPLEMENTACE TRPASLÍKU
Symboly DWARF jsou podporovány, když jsou vloženy do původního obrazu (ladicí binárka) nebo odstraněny do samostatného obrazu ELF (ladicí balíček).
Aby mohl být procházení zásobníku DWARF v Linuxu úspěšné, musí být původní binární soubor pro jakýkoli modul načtený do procesu Linuxu dostupný.
Symboly DWARF / obrázky ELF (odstraněny nebo ne) lze najít prostřednictvím cesty ke symbolům ladicího programu nebo serveru symbolů (indexovány dle požadavků .NET Core prostřednictvím hodnoty hash GNU Build ID).
DWARF symboly najdete prostřednictvím instalace ladicího balíčku ve stylu Linuxu. To je určeno adresářem nazvaným .build-id
v cestě symbolů. Pod tímto názvem jsou adresáře pojmenované podle prvního bajtu hodnoty hash GNU Build ID. V každém takovém adresáři je soubor s názvem <remaining 18 bytes of GNU Build ID hash>
.debug.
Když ladicí program otevře DWARF symboly, provede úvodní krok indexování, protože samotný formát neobsahuje potřebné vyhledávací tabulky. U velkých sad symbolů TRPASLÍKů (např. soukromé INFORMACE O TRPASLÍKu pro jádro Linuxu) může trvat 10 až 30 sekund.
!addsourcemap pro automatické načítání zdroje z známého repozitáře / commitu
Pokud ladíte komponenty vytvořené ze známého úložiště a potvrzení, existuje rozšíření, !addsourcemap
, které umožňuje příkazem ladicího programu zadat, že pro daný modul a cestu chcete automaticky načíst zdroje ze známé adresy URL. Použití rozšíření je:
!addsourcemap <module> <local spec> <remote spec>
Kde:
<module>
je název zajímavého modulu.
<local spec>
je cesta ke zdrojům v tomto modulu, které se budou vyhledat prostřednictvím adresy URL. Tato cesta by měla končit zástupným znakem.
<remote spec>
je adresa URL, na které se budou vyhledat soubory, které odpovídají <local spec>
. Tato cesta by měla končit zástupným znakem, který bude nahrazen podle toho, jak zástupný znak v <local spec>
odpovídá konkrétní zdrojové cestě.
Pokud chcete nastavit zdrojovou mapu, ověřte, že modul existuje, pomocí lm (List Loaded Modules). Pak určete vzdálené umístění zdroje.
Tento příklad nastaví modul vmlinux na konkrétní build dostupný na GitHubu.
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
Po vydání příkazu sourcemap může být načtení zdroje aktivováno několika způsoby, například přepínáním mezi snímky tam a zpět nebo opětovným načtením pomocí příkazu .reload. Potom dojde k automatickému stažení zdroje z GitHubu.
!sourcemaps
Pomocí příkazu !sourcemaps
zobrazte seznam existujících zdrojových map.
0:000> !sourcemaps
Source maps for vmlinux.6:
/build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
!removesourcemaps
Pomocí příkazu !removesourcemaps
odeberte existující zdrojovou mapu.
0:000> !removesourcemaps vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
1 source maps successfully removed
Řešení potíží se symboly DWARF
Pokud ladíte výpisy ze systému Linux nebo Android (nebo jiné cíle, které používají symboly DWARF), možná se budete chtít podívat na nezpracovaný obsah symbolů, abyste pochopili, proč jsou místní proměnné, definice typů nebo definice funkcí nesprávné. K tomu má ladicí program několik vestavěných rozšiřujících příkazů pro výpis surového obsahu symbolů DWARF. Kromě toho použijte linuxové nástroje, jako je readelf a dumpdwarf, k zobrazení interních informací o symbolech.
readelf – příkaz
Pomocí příkazu readelf na příkazovém řádku Linuxu zobrazte ID sestavení ladění vytvořené pro ukázkový program DisplayGreeting, který byl vytvořen v rámci ladění živého vzdáleného procesu Linuxu. V tomto příkladu je vráceno ID sestavení aba822dd158b997b09903d4165f3dbfd37f5e5c1.
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 lze použít s nástrojem grep pro vrácení verze symbolu.
readelf --debug-dump=info DisplayGreeting | grep -A 2 'Compilation Unit @'
Compilation Unit @ offset 0x0:
Length: 0x285c (32-bit)
Version: 5
trpaslík
Příkaz dwarfdump v systému Linux vytiskne nebo zkontroluje oddíly DWARF podle specifikovaných parametrů. Použijte dwarfdump -h k zobrazení mnoha možností.
bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -h
Další informace o používání dwarfdump na Ubuntu viz dwarfdump .
!diesym
Tento příkaz ladicího programu zobrazí die (nebo podstrom DIE) pro jakýkoli symbol v daném výrazu (může to být adresa, název funkce atd.) s volitelně zadanou úrovní rekurze. Vyhledá DIE pro symbol (obvykle funkci, ale může to být dáta atd.) obsažený na dané adrese a provede diagnostický výpis DIE podobný spuštění nástroje dwarfdump nebo llvm-dwarfdump na symbolech a nalezení DIE.
!diesym [options] <expression>
-r#
: rekurzivně vypište N úrovní. Za normálních okolností je to jeden a jen die sám je vyhozen.
<expression>
- Adresa k vyhledání die je dána výrazem. Může se jednat o plochou šestnáctkovou adresu (0x<blah>
) nebo může být jinak jedinečným názvem funkce.
Je potřeba ho vyhodnotit standardním vyhodnocením datového modelu. Pomocí příkazu dx ověřte, že výraz modelu. Další informace o použití příkazu dx naleznete v tématu dx (Display Debugger Object Model Expression).
0:000> dx DisplayGreeting!GetCppConGreeting
DisplayGreeting!GetCppConGreeting : DisplayGreeting!GetCppConGreeting+0x0 [Type: GetCppConGreeting]
Zobrazit informace o symbolu DIE pro ukázkový program DisplayGreeting, funkce GetCppConGreeting.
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)
Pomocí možnosti -r2 zobrazíte další úroveň informací o symbolu DIE.
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)
!zemřít
!die
zobrazí DIE (nebo podstrom DIE) pro libovolné DIE na zadaném posunu výrazu v ladicím oddílu DWARF s volitelnou úrovní rekurze.
!die [-r#] [-t] -m <module base expression> <offset expression>
-r#
: Rekurzivně vypiš N úrovní.
-t
: Pokud je DIE v jednotce typu v .debug_types namísto kompilační jednotky v .debug_info, je nutné zadat přepínač -t.
Zadejte -m <module base expression>
, která poskytuje základní adresu libovolného modulu, na který dotazujete.
<offset expression>
je velikost posunu DIE.
Na příkazovém řádku Linuxu použijte příkaz dwarfdump s -r pro vytištění .debug_aranges oddílu souboru DWARF k vyhledání odsazení 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
Poznamenejte si DW_AT_ranges hodnotu 0x0000000c
. V ladicím programu použijte tuto hodnotu posunu a název modulu DisplayGreeting k zobrazení informací o symbolu 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
Příkaz !dieancestry
se chová podobně jako !die
s tím rozdílem, že stoupá po stromu DIE směrem k jednotce obsahující kompilaci nebo typ, místo aby šel dolů.
!dieancestry [-r#] [-t] -m <module base expression> <offset expression>
-r#
: rekurzivně vypiš N úrovní.
Zadejte -m <module base expression>
, která poskytuje základní adresu libovolného modulu, na který dotazujete.
<offset expression>
je velikost posunu DIE.
Příklad:
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
Všimněte si, že odkazy, například na nadřazené nebo sourozenecké uzly, jsou klikatelné a umožňují další procházení stromu symbolů 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'
...
Nezobrazuje se veškerý výstup.
!dwunwind
!dwunwind
se trochu podobá .fnent (Display function data) pro PE obraz. Zobrazí pravidla odvíjení DWARF pro adresu určenou výrazem. Podobá se také příkazu readelf --unwind, který zobrazuje informace o uvolnění, když je k dispozici.
!dwunwind <expression>
Tento příklad zobrazí pravidla uvolnění pro funkci GetCppConGreeting v programu DisplayGreeting.
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
Zobrazí se odvíjecí zásobník pro registr ukazatele instrukce.
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
Tady je příklad protipříkladu programu.
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
Vypíše strom DIE pro daný modul na dané úrovni rekurze podobně jako při použití nástrojů dwarfdump nebo llvm-dwarfdump na symboly za účelem nalezení DIE.
!dietree [OPTIONS] -m <module base> <offset expression>
-r#
: Určení úrovně rekurze
-t
: Výpis .debug_types místo .debug_info
Základ modulu obsahujícího DIE musí být určen možností -m <expression>
.
<offset expression>
je velikost posunu DIE.
Příklad:
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
Pomocí možnosti -r2 zobrazte další hodnoty v dietree.
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'
...
Nezobrazuje se veškerý výstup. Všimněte si, že odkazy, například na sourozence, jsou klikatelné pro další procházení stromu symbolů DWARF.
!dielocal
Najde DIE pro místní proměnnou s názvem "name" a provede diagnostický výpis DIE podobný spuštění nástroje dwarfdump nebo llvm-dwarfdump na symbolech a nalezení DIE.
!dielocal [options] <name>
-r#
: rekurzivně vypiš N úrovní. Za normálních okolností je vyhozen pouze jeden kus, a to samotný die.
<name>
: místní proměnná s názvem "name".
Příklad:
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)
Viz také
Rozšířený přístup ke zdrojovému kódu
výpisy paměti při pádu systému Linux
ladění živého vzdáleného procesu Linuxu