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)