Symboles et sources Linux
Cet article décrit comment WinDbg prend en charge les symboles et les sources Linux standard. La prise en charge du débogage sur Linux nécessite WinDbg version 1.2402.24001.0 ou ultérieure.
Serveurs de symboles DebugInfoD
Le débogueur Windows utilise la norme DebugInfoD pour le téléchargement automatique des artefacts de build pour Linux. Pour comparer, DebugInfoD est une combinaison du serveur de symboles de Microsoft et des technologies du serveur source. Il permet le téléchargement automatique de trois types d’artefacts (exécutables (ELF), informations de débogage (DWARF) et source (code)) en fonction de l’ID de build. Différentes distributions de Linux hébergent désormais leurs propres serveurs DebugInfoD qui fournissent certains types d’artefacts. Les différents serveurs DebugInfoD sont répertoriés sur ELFUTILS https://debuginfod.elfutils.org.
Des informations générales sur DebugInfoD sont disponibles ici :
La balise DebugInfoD*
peut pointer vers un ou plusieurs serveurs DebugInfoD avec chaque URL de serveur mise en forme avec https://domain.com
et séparée par *
. Les serveurs seront recherchés dans le même ordre que dans le chemin d’accès source et les fichiers seront récupérés depuis la première URL correspondante.
Par exemple, vous pouvez définir le chemin d’accès des symboles comme suit.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Utilisez la commande !sym noisy
pour afficher des informations sur le chargement des symboles. Pour plus d’informations, consultez !sym.
La commande de chemin d’accès source (.srcpath, .lsrcpath (Définir le chemin d’accès source)) prend en charge la récupération de fichiers à partir de serveurs DebugInfoD via la balise DebugInfoD*
, ce qui permet la récupération des artefacts de code source. Par exemple, vous pouvez définir le chemin d’accès source comme suit.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Pour plus d’informations, consultez Source Code Extended Access (Accès étendu au code source).
Symboles DWARF
DWARF est un format de données de débogage standardisé et largement utilisé. DWARF a été initialement conçu avec un format exécutable et liable (Executable and Linkable Format, ELF) bien qu’il soit indépendant des formats de fichier objet. Pour plus d’informations, consultez https://en.wikipedia.org/wiki/DWARF et pour la version 5 standard, consultez DWARF Version 5.
Utilisez la commande de vidage d’objet pour déterminer la version du symbole DWARF. Cet exemple concerne la 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
Prise en charge WinDbg de DWARF
WinDbg prend en charge les utilisations suivantes de DWARF et ELF.
Mode utilisateur Linux – Ouverture du vidage principal des ELF Linux (
-z <core dump>
) et exécution du débogage et de l’analyse post-mortem avec les symboles DWARF privés et complets.Mode noyau Linux – Ouverture du vidage de noyau Linux (ELF VMCORE) et exécution du débogage et de l’analyse post-mortem avec les symboles DWARF privés et complets.
Mode noyau Linux – Ouverture des KDUMP compressés du noyau Linux et exécution du débogage et de l’analyse post-mortem avec les symboles DWARF privés et complets (WinDbg prend uniquement en charge les fichiers KDUMP compressés par ZLIB, et non ceux compressés par LZO ou Snappy.)
Ouverture d’images ELF (
-z <ELF image>
) et examen du contenu, du désassemblement, etc.Autres scénarios – Compréhension des images ELF et des symboles DWARF dans des environnements PE/ELF mixtes (par exemple, le débogage des composants Open Enclave chargés sur Windows. Pour plus d’informations, consultez Débogage Open Enclave.)
Prise en charge Linux du GDBServer de WinDbg
Le débogueur de GNU, GDBServer, est utilisé sur Linux pour prendre en charge la connexion WinDbg. Pour plus d’informations sur GDBServer, consultez https://en.wikipedia.org/wiki/Gdbserver. Pour consulter la documentation du débogage gdb distant, utilisez le lien suivant : https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging
Pour plus d’informations sur l’utilisation de GDBServer avec WinDbg et pour une présentation détaillée du code, consultez Débogage en direct du processus distant de Linux. Les exemples de cette page utilisent Ubuntu exécuté par le Sous-système Windows pour Linux (WSL), mais d’autres implémentations Linux peuvent également être utilisées.
Implémentation de DWARF
Les symboles DWARF sont pris en charge en étant intégrés dans l’image d’origine (un binaire de débogage) ou transférés dans une autre image ELF (un package de débogage).
Pour que la recherche de la pile DWARF Linux s’effectue correctement, l’image binaire originale de tout module chargé dans le processus Linux doit être disponible.
Les symboles DWARF/les images ELF (élagués ou non) sont disponibles via le sympath du débogueur ou le serveur de symboles (indexé selon .NET Core via le hachage de l’ID de build GNU).
Vous trouverez des symboles DWARF via une installation de package de débogage de style Linux. Vous le trouverez dans le répertoire nommé .build-id
dans le chemin d’accès aux symboles. Sous celui-ci se trouvent des répertoires nommés en fonction du premier octet du hachage d’ID de build GNU. Sous chaque répertoire de ce type se trouve un fichier nommé <remaining 18 bytes of GNU Build ID hash>
.debug.
Lorsque le débogueur ouvre des symboles DWARF, il effectue une étape d’indexation initiale, car le format lui-même n’inclut pas les tables de recherche nécessaires. Pour les grands ensembles de symboles DWARF (par exemple, les informations DWARF privées pour le noyau Linux), cette étape peut prendre 10 à 30 secondes.
!addsourcemap pour la récupération automatique de source à partir d’un référentiel connu
Si vous déboguez des composants créés à partir d’un référentiel connu, il existe une commande de débogueur d’extension, !addsourcemap
, vous permettant d’indiquer au débogueur que pour un module et un chemin donnés, vous souhaitez récupérer automatiquement des sources à partir d’une URL connue. L’extension s’utilise comme suit :
!addsourcemap <module> <local spec> <remote spec>
Où :
<module>
est le nom du module d’intérêt.
<local spec>
est le chemin d’accès aux sources au sein de ce module qui sera recherché via une URL. Ce chemin doit se terminer par un caractère générique.
<remote spec>
est l’URL dans laquelle les fichiers qui correspondent à <local spec>
sont recherchés. Ce chemin doit se terminer par un caractère générique qui sera remplacé par la façon dont le caractère générique dans <local spec>
correspond à un chemin source particulier.
Pour définir le sourcemap, vérifiez que le module est présent à l’aide de lm (Lister les modules chargés). Déterminez ensuite l’emplacement distant de la source.
Cet exemple montre comment définir le module vmlinux sur une version spécifique disponible sur 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
Une fois la commande sourcemap émise, un certain nombre d’éléments déclenchent une charge source, par exemple en basculant des images ou en rechargeant à l’aide de la commande .reload. Après cela, l’extraction automatique de la source à partir de GitHub se produit.
!sourcemaps
Utilisez la commande !sourcemaps
pour répertorier les mappages de source existants.
0:000> !sourcemaps
Source maps for vmlinux.6:
/build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
!removesourcemaps
Utilisez la commande !removesourcemaps
pour supprimer un mappage de source existant.
0:000> !removesourcemaps vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
1 source maps successfully removed
Résolution des problèmes liés aux symboles DWARF
Si vous déboguez des vidages Linux/Android (ou d’autres cibles qui utilisent des symboles DWARF), il peut être intéressant d’examiner le contenu brut des symboles pour comprendre pourquoi les variables locales, les définitions de type ou les définitions de fonction sont incorrectes. Pour ce faire, le débogueur dispose de commandes d’extension intégrées pour vider le contenu brut des symboles DWARF. En outre, utilisez des utilitaires Linux tels que readelf et dumpdwarf pour afficher des informations internes sur les symboles.
Commande readelf
Utilisez la commande readelf à l’invite de commandes Linux pour afficher l’ID de build du débogage créé pour l’extrait de programme DisplayGreeting ; lui-même créé dans le débogage en direct du processus distant de Linux. Dans cet exemple, un ID de build aba822dd158b997b0999903d4165f3dbfd37f5e5c1 est retourné.
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 peut être utilisé avec grep pour retourner la version du symbole.
readelf --debug-dump=info DisplayGreeting | grep -A 2 'Compilation Unit @'
Compilation Unit @ offset 0x0:
Length: 0x285c (32-bit)
Version: 5
dwarfdump
La commande linux dwarfdump affiche ou vérifie les sections DWARF comme demandé par des options spécifiques. Utilisez dwarfdump -h pour afficher les nombreuses options.
bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -h
Pour plus d’informations sur l’utilisation de dwarfdump sur Ubuntu, consultez dwarfdump .
!diesym
Cette commande de débogueur affiche le DIE (ou la sous-arborescence de DIE) de tout symbole au niveau de l’expression donnée (par exemple, une adresse, un nom de fonction, etc.) avec un niveau de récursivité éventuellement spécifié. Elle localise le DIE pour le symbole (généralement sa fonction, mais peut également être des données, etc.) contenu à une adresse donnée et effectue un vidage de diagnostic du DIE semblable à l’exécution de dwarfdump ou llvm-dwarfdump sur les symboles et à la recherche du DIE.
!diesym [options] <expression>
-r#
: vidage des niveaux N de manière récursive. Normalement, il s’agit de la seule et unique fois où le DIE lui-même est vidé.
<expression>
– L’adresse pour localiser le DIE est donnée par une expression. Il peut s’agir d’une adresse hexadécimal plate (0x<blah>
) ou d’un nom de fonction unique.
Elle doit pouvoir être évaluée par la méthode d’évaluation standard du modèle de données. Utilisez la commande dx pour valider l’expression de modèle. Pour plus d’informations sur l’utilisation de la commande dx, consultez dx (Afficher l’expression du modèle d’objet de débogage).
0:000> dx DisplayGreeting!GetCppConGreeting
DisplayGreeting!GetCppConGreeting : DisplayGreeting!GetCppConGreeting+0x0 [Type: GetCppConGreeting]
Affichez les informations de symbole DIE pour l’extrait du programme DisplayGreeting, la fonction 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)
Utilisez l’option -r2 pour afficher un niveau supplémentaire d’informations sur les symboles 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)
!die
!die
affiche le DIE (ou la sous-arborescence DIE) pour tout DIE se trouvant à l’expression de décalage donnée dans la section de débogage DWARF avec un niveau de récursivité éventuellement spécifié.
!die [-r#] [-t] -m <module base expression> <offset expression>
-r#
: vidage des niveaux N de manière récursive.
-t
: si le DIE est intégré à une unité de type dans .debug_types au lieu d’une unité de compilation dans .debug_info, vous devez spécifier le switch -t.
Fournissez une -m <module base expression>
qui donne l’adresse de base du module que vous recherchez.
L’<offset expression>
correspond à la taille du décalage DIE.
À l’invite Linux, utilisez dwarfdump avec le fichier -r pour afficher la section .debug_aranges du fichier DWARF pour localiser le décalage 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
Vous pouvez voir la valeur du DW_AT_ranges de 0x0000000c
. Dans le débogueur, utilisez cette valeur de décalage et le nom du module DisplayGreeting pour afficher les informations du symbole 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
La commande !dieancestry
se comporte de la même façon que !die
, sauf qu’elle monte dans l’arborescence DIE vers l’unité qui contient compilation ou celle type, au lieu de descendre dans l’arborescence.
!dieancestry [-r#] [-t] -m <module base expression> <offset expression>
-r#
: vidage des niveaux N de manière récursive.
Fournissez une -m <module base expression>
qui donne l’adresse de base du module que vous recherchez.
L’<offset expression>
correspond à la taille du décalage DIE.
Exemple :
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
Notez que les liens, par exemple aux parents ou aux frères, sont cliquables pour permettre une traversée plus poussée de l’arborescence de symboles 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'
...
Toutes les sorties ne sont pas affichées.
!dwunwind
!dwunwind
s’apparente à .fnent (Afficher les données de fonction) pour les images PE. Elle affiche les règles de déroulement DWARF pour une adresse donnée par l’expression. Elle est également semblable à la commande readelf --unwind, qui affiche les informations de déroulement lorsqu’elle est disponible.
!dwunwind <expression>
Cet exemple montre comment afficher les règles de déroulement de la fonction GetCppConGreeting dans le programme 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
Cette opération affiche la pile de déroulement pour le registre du pointeur d’instruction.
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
Voici un exemple de compteur de programme.
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
Vide l’arbre DIE pour un module donné à un niveau de récursion donné. Son action est semblable à l’exécution de dwarfdump ou llvm-dwarfdump sur les symboles ainsi qu’à la recherche de DIE.
!dietree [OPTIONS] -m <module base> <offset expression>
-r#
: spécifie le niveau de récursivité
-t
: vidage de .debug_types et non de .debug_info
La base du module contenant le DIE doit être donnée par l’option -m <expression>
.
L’<offset expression>
correspond à la taille du décalage DIE.
Exemple :
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
Utilisez l’option -r2 pour afficher des valeurs supplémentaires dans le 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'
...
Toutes les sorties ne sont pas affichées. Notez que les liens, par exemple aux frères, sont cliquables pour permettre une traversée plus poussée de l’arborescence de symboles DWARF.
!dielocal
Localise le DIE pour la variable locale nommée « name » et effectue un vidage de diagnostic du DIE semblable à l’exécution de dwarfdump ou llvm-dwarfdump sur les symboles ainsi qu’à la recherche du DIE.
!dielocal [options] <name>
-r#
: vidage des niveaux N de manière récursive. Normalement, il s’agit de la seule et unique fois où le DIE lui-même est vidé.
<name>
: variable locale nommée « name ».
Exemple :
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)