Partager via


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) 

Voir aussi

Accès étendu au code source

ELFUTILS debuginfod

DWARF Version 5

Utilisation des symboles

!sym