Sdílet prostřednictvím


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

ELFUTILS debuginfod

TRPASLÍK Verze 5

Používání symbolů

!sym

výpisy paměti při pádu systému Linux

ladění živého vzdáleného procesu Linuxu