Freigeben über


Linux-Symbole und -Quellen

In diesem Artikel wird beschrieben, wie WinDbg Standardsymbole und Standardquellen von Linux unterstützt. Die Unterstützung für das Debuggen unter Linux erfordert WinDbg Version 1.2402.24001.0 oder höher.

DebugInfoD-Symbolserver

Der Windows-Debugger verwendet den Standard DebugInfoD zum automatischen Herunterladen von Buildartefakten für Linux. DebugInfoD ist eine Kombination aus Microsoft-Symbolserver und Microsoft-Quellservertechnologien. Die Lösung ermöglicht das automatische Herunterladen von drei Artefakttypen (ausführbare Dateien, ELF), Debuginformationen (DWARF) und Quellcode (Code) basierend auf der Build-ID. Verschiedene Linux-Verteilungen hosten jetzt eigene DebugInfoD-Server, die einige der Artefakttypen bereitstellen. Die verschiedenen DebugInfoD-Server werden unter ELFUTILS https://debuginfod.elfutils.org aufgeführt.

Allgemeine Informationen zu DebugInfoD finden Sie hier:

Das Tag DebugInfoD* kann auf einen oder mehrere DebugInfoD-Server verweisen, wobei jede Server-URL als https://domain.com formatiert ist und durch *getrennt wird. Die Server werden in derselben Reihenfolge durchsucht wie im Quellpfad aufgeführt. Die Dateien werden aus der ersten übereinstimmenden URL abgerufen.

Sie können den Symbolpfad beispielsweise wie folgt festlegen.

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

Zeigen Sie mit dem Befehl !sym noisy Informationen zum Laden von Symbolen an. Weitere Informationen finden Sie unter !sym.

Der Quellpfadbefehl (.srcpath, .lsrcpath (Quellpfad festlegen)) unterstützt den Dateiabruf von DebugInfoD-Servern über das Tag DebugInfoD*, was das Abrufen von Quellcodeartefakten ermöglicht. Sie könnten den Symbolpfad beispielsweise wie folgt festlegen.

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

Weitere Informationen finden Sie unter Erweiterter Quellcodezugriff.

DWARF-Symbole

DWARF ist ein weit verbreitetes, standardisiertes Debugging-Datenformat. DWARF wurde ursprünglich zusammen mit Executable and Linkable Format (ELF) entworfen, auch wenn das Format von Objektdateiformaten unabhängig ist. Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/DWARF. Informationen zur Version 5 des Standards finden Sie unter DWARF Version 5.

Ermitteln Sie mit dem Objektdump-Befehl die Version des DWARF-Symbols. In diesem Beispiel ist dies Version 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

DWARF-Unterstützung von WinDbg

WinDbg unterstützt die folgenden Verwendungen von DWARF und ELF.

  • Linux-Benutzermodus – Öffnen von Linux ELF-Coredumps (-z <core dump>) und Durchführen von Post-Mortem-Debugging und -Analysen mit vollständigen privaten DWARF-Symbolen.

  • Linux-Kernelmodus – Öffnen von Linux Kernel-Dumps (ELF VMCORE) und Durchführen von Post-Mortem-Debugging und -Analysen mit vollständigen privaten DWARF-Symbolen.

  • Linux Kernel-Modus – Öffnen von komprimierten Linux Kernel-KDUMPs und Durchführen von Post-Mortem-Debugging und -Analysen mit vollständigen privaten DWARF-Symbolen. (WinDbg unterstützt nur ZLIB-komprimierte KDUMP-Dateien; LZO- und Snappy-komprimierte KDUMPs werden nicht unterstützt.)

  • Öffnen von ELF-Images (-z <ELF image>) und Untersuchung von Inhalten, Disassemblierung usw.

  • Weitere Szenarien – Verstehen von ELF-Images und DWARF-Symbolen in gemischten PE/ELF-Umgebungen; z. B. Debuggen von Open Enclave-Komponenten, die unter Windows geladen wurden. Weitere Informationen finden Sie unter Open Enclave-Debugging.

Linux-Unterstützung von WinDbg GDBServer

Der GNU Debugger GDBServer wird unter Linux verwendet, um die WinDbg-Verbindung zu unterstützen. Weitere Informationen zu GDBServer finden Sie unter https://en.wikipedia.org/wiki/Gdbserver. Sie finden die Dokumentation für das gdb-Remotedebugging beispielsweise hier: https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging

Weitere Informationen zur Verwendung von GDBServer mit WinDbg und eine exemplarische Code-Vorgehensweise finden Sie unter Debuggen von Linux-Live-Remoteprozessen. Die hier erwähnten Beispiele verwenden Ubuntu unter dem Windows-Subsystem für Linux (WSL). Es können jedoch auch andere Linux-Implementierungen verwendet werden.

DWARF-Implementierung

DWARF-Symbole werden unterstützt, wenn sie in das Original-Image eingebettet sind (Debug-Binärdatei) oder zu einem separaten ELF-Image (Debugpaket) entfernt wurden.

Damit der DWARF-Stackwalk in Linux erfolgreich ist, muss das ursprüngliche binäre Image für jedes Modul, das in den Linux-Prozess geladen wurde, gefunden werden können.

DWARF-Symbole/ELF-Images (entfernt oder nicht) können über den Sympath des Debuggers oder den Symbolserver gefunden werden (indiziert gemäß .NET Core über den GNU Build ID-Hash).

DWARF-Symbole finden Sie über eine Linux-Debugpaketinstallation. Sie finden diese in einem Verzeichnis namens .build-id im Symbolpfad. Unter diesen Verzeichnis befinden sich Verzeichnisse, die nach dem ersten Byte des GNU Build ID-Hash benannt sind. In jedem dieser Verzeichnisse befindet sich eine Datei mit dem Namen <remaining 18 bytes of GNU Build ID hash>.debug.

Wenn der Debugger DWARF-Symbole öffnet, führt er einen anfänglichen Indizierungsschritt aus, da das Format selbst die notwendigen Lookuptabellen nicht enthält. Für große Sätze von DWARF-Symbolen (z. B. private DWARF-Informationen für den Linux-Kernel), kann dies 10 bis 30 Sekunden dauern.

!addsourcemap für den automatischen Quellabruf aus einem bekannten Repository/Commit

Wenn Sie Komponenten debuggen, die aus einem bekannten Repository und Commit erstellt wurden, gibt es die Erweiterung !addsourcemap. Der Debuggerbefehl teilt dem Debugger mit, dass Sie für ein bestimmtes Modul und einen bestimmten Pfad automatisch Quellen aus einer bekannten URL abrufen möchten. Die Erweiterung wird wie folgt verwendet:

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

Hierbei gilt:

<module> ist der Name des Moduls von Interesse.

<local spec> ist der Pfad der Quellen innerhalb dieses Moduls, der über eine URL nachgeschlagen wird. Dieser Pfad sollte mit einem Platzhalter enden.

<remote spec> ist die URL, unter der Dateien nachschlagen werden, die mit <local spec> übereinstimmen. Dieser Pfad sollte mit einem Platzhalter enden, der durch die Weise ersetzt wird, wie der Platzhalter in <local spec> mit einem bestimmten Quellpfad übereinstimmt.

Um die Sourcemap festzulegen, überprüfen Sie mit lm (Geladene Module auflisten), ob das Modul vorhanden ist. Bestimmen Sie anschließend den Remotestandort der Quelle.

In diesem Beispiel wird das vmlinux-Modul auf einen bestimmten Build festgelegt, der auf GitHub verfügbar ist.

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

Nach Ausgabe des Befehls sourcemap löst eine Reihe von Elementen das Laden der Quelle aus, z. B. das Hin- und Herwechseln oder erneute Laden von Frames mithilfe des Befehls .reload. Anschließend erfolgt ein automatischer Pull der Quelle von GitHub.

!sourcemaps

Verwenden Sie den Befehl !sourcemaps, um vorhandene Quellzuordnungen auflisten.

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

!removesourcemaps

Mit dem Befehl !removesourcemaps entfernen Sie eine vorhandene Quellzuordnung.

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

Problembehandlung von DWARF-Symbolen

Wenn Sie Linux/Android-Dumps debuggen (oder andere Ziele, die DWARF-Symbole verwenden), sollten Sie sich den unformatierten Inhalt von Symbolen ansehen, um zu verstehen, warum lokale Variablen, Typdefinitionen oder Funktionsdefinitionen falsch sind. Hierfür verfügt der Debugger über einige integrierte Erweiterungsbefehle, um den unformatierten Inhalt von DWARF-Symbolen abzubilden. Zusätzlich können Sie Linux-Dienstprogramme wie Readelf und dumpdwarf verwenden, um interne Symbolinformationen anzuzeigen.

Der Befehl readelf

Verwenden Sie den Befehl readelf an der Linux-Eingabeaufforderung, um die Debugbuild-ID anzuzeigen, die für das Beispielprogramm DisplayGreeting im Linux-Live-Remoteprozessdebugging erstellt wurde. In diesem Beispiel wird eine Build-ID von aba822dd158b997b09903d4165f3dbfd37f5e5c1 zurückgegeben.

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

Der Befehl readelf kann mit Grep verwendet werden, um die Symbolversion zurückzugeben.

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

Der Befehl dwarfdump

Der Linux-Befehl dwarfdump druckt oder überprüft DWARF-Abschnitte, wie sie von bestimmten Optionen angefordert werden. Mit dwarfdump -h können Sie die zahlreichen Optionen anzeigen.

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

Weitere Informationen zur Verwendung von dwarfdump in Ubuntu finden Sie unter dwarfdump .

Der Befehl !diesym

Mit diesem Debuggerbefehl wird die DIE (oder die DIE-Unterstruktur) für das Symbol im angegebenen Ausdruck (eine Adresse, ein Funktionsname usw.) mit einer optional angegebenen Rekursionsebene angezeigt. Der Befehl sucht die DIE für das Symbol (in der Regel eine Funktion; es können jedoch auch Daten usw. sein), die sich unter einer bestimmten Adresse befindet, und führt einen Diagnosedump der DIE aus, ähnlich der Ausführung von dwarfdump oder llvm-dwarfdump für die Symbole, um die DIE zu suchen.

!diesym [options] <expression>

-r#: rekursives Dumpen von N-Ebenen. Normalerweise ist dies eine Ebene und nur die DIE selbst wird gedumpt.

<expression> – Die Adresse zum Suchen der DIE wird durch einen Ausdruck angegeben. Es kann sich um eine flache Hexadresse (0x<blah>) oder um einen anderen eindeutigen Funktionsnamen handeln.

Er muss durch die Standardauswertung des Datenmodells ausgewertet werden können. Überprüfen Sie mit dem Befehl dx, ob der Modellausdruck vorhanden ist. Weitere Informationen zur Verwendung des Befehls dx finden Sie unter dx (Debugger-Objektmodellausdruck anzeigen).

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

Zeigt DIE-Symbolinformationen für das Beispielprogramm DisplayGreeting, Funktion GetCppConGreeting an.

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)

Verwenden Sie die Option -r2, um eine zusätzliche Ebene von DIE-Symbolinformationen anzuzeigen.

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) 

Der Befehl !die

!die zeigt die DIE (oder die DIE-Unterstruktur) für die DIE, die sich am angegebenen Offsetausdruck innerhalb des DWARF-Debugabschnitts befindet, mit einer optional angegebenen Rekursionsebene an.

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

-r#: rekursives Dumpen von N-Ebenen.

-t: Wenn sich die DIE innerhalb einer Typeinheit in .debug_types anstelle einer Kompilierungseinheit innerhalb von .debug_info befindet, müssen Sie den Schalter -t angeben.

Geben Sie eine -m <module base expression>-Adresse an, die die Basisadresse des Moduls angibt, zu dem Sie eine Abfrage ausführen.

<offset expression> ist die Größe des DIE-Offsets.

Verwenden Sie an der Linux-Eingabeaufforderung dwarfdump -r, um den Abschnitt .debug_aranges der DWARF-Datei zu drucken und den DIE-Offset zu suchen.

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

Notieren Sie sich den Wert für DW_AT_ranges von 0x0000000c. Verwenden Sie im Debugger diesen Offsetwert und den Modulnamen von DisplayGreeting, um DIE-Symbolinformationen anzuzeigen.

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

Der Befehl !dieancestry verhält sich ähnlich wie !die, jedoch mit der Ausnahme, dass er sich in der DIE-Struktur nach oben in Richtung der übergeordneten Kompilierungs- oder Typeinheit bewegt und nicht abwärts.

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

-r#: rekursives Dumpen von N-Ebenen.

Geben Sie eine -m <module base expression>-Adresse an, die die Basisadresse des Moduls angibt, zu dem Sie eine Abfrage ausführen.

<offset expression> ist die Größe des DIE-Offsets.

Beispiel:

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       

Beachten Sie, dass Links, z. B. zu über- oder gleichgeordneten Elementen, klickbar sind, um eine weitere Durchquerung der DWARF-Symbolstruktur zu ermöglichen.

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'

...
   

Es werden nicht alle Ausgaben angezeigt.

Der Befehl !dwunwind

!dwunwind funktioniert ähnlich wie .fnent (Anzeigefunktionsdaten), jedoch für PE-Images. Er zeigt die DWARF-Entladungscodes für eine Adresse an, die durch den Ausdruck angegeben wird. Er verhält sich auch ähnlich dem Befehl readelf --unwind, der Entladungsinformationen anzeigt, wenn sie verfügbar sind.

!dwunwind <expression>

In diesem Beispiel werden die Entladungsregeln für die Funktion GetCppConGreeting im DisplayGreeting-Programm angezeigt.

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

Dies zeigt den Entladungsstack für das Anweisungsverweisregister an.

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

Dies ist ein Beispiel für einen Programmzähler.

   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

Der Befehl !dietree

Dieser Befehl dumpt die DIE-Struktur für ein bestimmtes Modul auf einer bestimmten Rekursionsebene, ähnlich der Ausführung von dwarfdump oder llvm-dwarfdump für die Symbole, um die DIE zu suchen.

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

-r#: Angabe der Rekursionsebene

-t: .debug_types dumpen, nicht .debug_info

Die Modulbasis für das Modul, das das DIE enthält, muss mit der Option -m <expression> angegeben werden.

<offset expression> ist die Größe des DIE-Offsets.

Beispiel:

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  

Verwenden Sie die Option -r2, um zusätzliche Werte in der DIE-Struktur anzuzeigen.

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'

...

Es werden nicht alle Ausgaben angezeigt. Beachten Sie, dass Links, z. B. zu gleichgeordneten Elementen, klickbar sind, um eine weitere Durchquerung der DWARF-Symbolstruktur zu ermöglichen.

Der Befehl !dielocal

Sucht die DIE für die lokale Variable namens „name“ und führt einen Diagnosedump der DIE aus, ähnlich der Ausführung von dwarfdump oder llvm-dwarfdump für die Symbolen, um die DIE zu suchen.

!dielocal [options] <name>

-r#: rekursives Dumpen von N-Ebenen. Normalerweise ist dies eine Ebene und nur die DIE selbst wird gedumpt.

<name>: lokale Variable mit dem Namen „name“.

Beispiel:

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) 

Siehe auch

Erweiterter Quellcodezugriff

ELFUTILS debuginfod

DWARF Version 5

Verwenden von Symbolen

!sym

Linux-Absturzabbilder

Linux Live-Remote-Prozess-Debugging