Compartir a través de


Símbolos y orígenes de Linux

En este artículo se describe cómo WinDbg admite símbolos y orígenes estándar de Linux. La compatibilidad con la depuración en Linux requiere WinDbg versión 1.2402.24001.0 o posterior.

Servidores de símbolos DebugInfoD

El depurador DebugInfoD usa el estándar DebugInfoD para la descarga automática de artefactos de compilación para Linux. Comparativamente, DebugInfoD es una combinación de las tecnologías de servidor de símbolos y servidor de fuentes de Microsoft. Permite la descarga automática de tres tipos de artefactos (ejecutables (ELF), información de depuración (DWARF) y código fuente) en función del identificador de compilación. Varias distribuciones de Linux alojan ahora sus propios servidores DebugInfoD que proporcionan algunos de los tipos de artefactos. Los distintos servidores DebugInfoD se enumeran en ELFUTILS https://debuginfod.elfutils.org.

La información general sobre DebugInfoD está disponible aquí:

La etiqueta DebugInfoD* puede apuntar a uno o varios servidores DebugInfoD con cada dirección URL de servidor con formato https://domain.com y separados por *. Los servidores se buscarán en el mismo orden que se muestra en la ruta de acceso de origen y los archivos se recuperarán de la primera dirección URL coincidente.

Por ejemplo, puede establecer la ruta de acceso del símbolo de esta manera.

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

Use el comando !sym noisy para mostrar información sobre la carga de símbolos. Para más información, consulte !sym.

El comando de ruta de acceso de origen (.srcpath, .lsrcpath (Establecer ruta de acceso de origen)) admite la recuperación de archivos de servidores DebugInfoD a través de la etiqueta DebugInfoD*, lo que permite la recuperación de artefactos de código fuente. Por ejemplo, puede establecer la ruta de acceso de origen de esta manera.

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

Para obtener más información, consulte Acceso extendido de código fuente.

Símbolos DWARF

DWARF es un formato de datos de depuración ampliamente utilizado y estandarizado. DWARF se diseñó originalmente junto con el formato ejecutable y enlazable (ELF), aunque es independiente de los formatos de archivos objeto. Para obtener más información, consulte https://en.wikipedia.org/wiki/DWARF y para el estándar de la versión 5, consulte DWARF Versión 5.

Use el comando de volcado de objetos para determinar la versión del símbolo DWARF. En este ejemplo, versión 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

Compatibilidad con WinDbg DWARF

WinDbg admite los siguientes usos de DWARF y ELF.

  • Modo de usuario de Linux - Abrir volcados del núcleo ELF de Linux (-z <core dump>) y hacer depuración y análisis post-mortem con símbolos DWARF privados completos.

  • Modo de kernel de Linux: Abrir volcados de kernel de Linux (ELF VMCORE) y realizar depuración y análisis post-mortem con símbolos DWARF privados completos.

  • Modo de kernel de Linux: Abrir KDUMPs comprimidos del Kernel de Linux y hacer depuración post-mortem y análisis con símbolos DWARF privados completos (WinDbg solo admite archivos KDUMP comprimidos ZLIB. Los KDUMPs comprimidos con LZO y Snappy no están admitidos).

  • Abrir imágenes ELF (-z <ELF image>) y examinar el contenido, desensamblar, etc.

  • Otros escenarios: Comprensión de imágenes ELF y símbolos DWARF en entornos mixtos PE/ELF (por ejemplo: depuración de componentes Open Enclave cargados en Windows. Para obtener más información, consulte Depuración de Open Enclave debugging).

Compatibilidad con Linux de WinDbg GDBServer

El depurador GNU, GDBServer se usa en Linux para permitir la conexión WinDbg. Para más información sobre GDBServer, consulte https://en.wikipedia.org/wiki/Gdbserver. Aquí puede consultar documentación de la depuración remota de gdb: https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging

Para obtener más información sobre el uso de GDBServer con WinDbg y un tutorial de código, consulte Depuración de procesos remotos en directo de Linux. En los ejemplos se usa Ubuntu con el subsistema Windows para Linux (WSL), pero también se pueden usar otras implementaciones de Linux.

Implementación de DWARF

Los símbolos DWARF se admiten incrustados en la imagen original (un binario de depuración) o se quitan en una imagen ELF independiente (un paquete de depuración).

Para que el recorrido por la pila DWARF de Linux tenga éxito, es necesario encontrar la imagen binaria original de cualquier módulo cargado en el proceso Linux.

Los símbolos DWARF/imágenes ELF (eliminados o no) se pueden encontrar a través del sympath del depurador o del servidor de símbolos (indexado según .NET Core a través del hash GNU Build ID).

Los símbolos DWARF se pueden encontrar a través de una instalación de paquetes de depuración al estilo Linux. Esto viene dado por un directorio denominado .build-id en la ruta del símbolo. Dentro hay directorios nombrados según el primer byte del hash GNU Build ID. En cada uno de estos directorios hay un archivo llamado <remaining 18 bytes of GNU Build ID hash>.debug.

Cuando el depurador abre símbolos DWARF, realiza un paso de indexación inicial, ya que el formato en sí no incluye las tablas de búsqueda necesarias. Para grandes conjuntos de símbolos DWARF (por ejemplo: información DWARF privada para el núcleo Linux), esto puede tardar entre 10 y 30 segundos.

!addsourcemap para la recuperación automática de origen desde un repositorio conocido/confirmación

Si está depurando componentes compilados a partir de un repositorio y una confirmación conocidos, hay una extensión, !addsourcemap del comando debugger que permite indicar al depurador que para un módulo y una ruta de acceso concretos, le gustaría recuperar automáticamente los orígenes de una dirección URL conocida. El uso de la extensión es:

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

Donde:

<module> es el nombre del módulo de interés.

<local spec> es la ruta de acceso de los orígenes dentro de ese módulo que se buscará a través de una dirección URL. Esta ruta de acceso debe terminar en un carácter comodín.

<remote spec> es la dirección URL en la que se buscarán los archivos que coincidan con <local spec>. Esta ruta de acceso debe terminar en un carácter comodín que se reemplazará por el modo en que el carácter comodín de <local spec> coincide con una ruta de acceso de origen determinada.

Para establecer el mapa de origen, confirme que el módulo está presente mediante lm (Enumerar módulos cargados). A continuación, determine la ubicación remota del origen.

En este ejemplo se establece el módulo vmlinux en una compilación específica disponible en 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

Una vez emitido el comando sourcemap, varios elementos desencadenarán una carga de origen, por ejemplo, al cambiar fotogramas hacia atrás y hacia delante o volver a cargar, mediante el comando .reload. A continuación, se producirá una extracción automática de origen de GitHub.

!sourcemaps

Use el comando !sourcemaps para enumerar los mapas de origen existentes.

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

!removesourcemaps

Use el comando !removesourcemaps para quitar un mapa de origen existente.

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

Solución de problemas con símbolos DWARF

Si está depurando volcados de Linux/Android (u otros objetivos que utilicen símbolos DWARF), es posible que desee ver el contenido sin procesar de los símbolos para comprender por qué las variables locales, las definiciones de tipos o las definiciones de funciones son incorrectas. Para ello, el depurador tiene algunos comandos de extensión incorporados para volcar el contenido sin procesar de los símbolos DWARF. Además, use utilidades de Linux como readelf y dumpdwarf para mostrar información interna de los símbolos.

Comando readelf

Use el comando readelf en el símbolo del sistema de Linux para mostrar el ID de compilación de depuración que se creó para el programa DisplayGreeting de ejemplo creado en la depuración de procesos remotos vivo de Linux. En este ejemplo, se devuelve un ID de compilación de 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 se puede usar con grep para devolver la versión del símbolo.

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

dwarfdump

El comando de linux dwarfdump imprime o comprueba secciones DWARF según lo soliciten opciones específicas. Use dwarfdump -h para ver las numerosas opciones.

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

Para obtener más información sobre el uso de dwarfdump en Ubuntu, consulte dwarfdump .

!diesym

Este comando del depurador mostrará el DIE (o subárbol DIE) para cualquier símbolo que se encuentre en la expresión especificada (puede ser una dirección, un nombre de función, etc.) con un nivel de recursividad especificado opcionalmente. Localiza el DIE para el símbolo (típicamente función pero podría ser datos, etc...) contenido en una dirección dada y realiza un volcado de diagnóstico del DIE similar a ejecutar dwarfdump o llvm-dwarfdump en los símbolos y encontrar el DIE.

!diesym [options] <expression>

-r#: volcado de N niveles recursivamente. Normalmente, este es uno y solo se vuelca el propio DIE.

<expression> - La dirección para localizar el DIE viene dada por una expresión. Puede ser una dirección hexadecimal plana (0x<blah>) o puede ser un nombre de función único.

Debe ser evaluable mediante la evaluación estándar del modelo de datos. Use el comando dx para validar la expresión del modelo. Para obtener más información sobre el uso del comando dx, consulte dx (Mostrar la expresión del modelo de objeto del depurador).

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

Muestre información de símbolos DIE para el programa de ejemplo DisplayGreeting, función 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)

Use la opción -r2 para mostrar un nivel adicional de información de símbolos 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 mostrará el DIE (o subárbol DIE) para cualquier DIE que se encuentre en la expresión de desplazamiento especificada dentro de la sección de depuración DWARF con un nivel de recursividad especificado opcionalmente.

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

-r#: volcado de N niveles recursivamente.

-t: si el DIE está dentro de una unidad de tipo en .debug_types en lugar de una unidad de compilación dentro de .debug_info, debe especificar el modificador -t.

Proporcione un -m <module base expression> que proporcione la dirección base de cualquier módulo que esté consultando.

<offset expression> es el tamaño del desplazamiento DIE.

En el símbolo del sistema de Linux, use dwarfdump con -r para imprimir la sección .debug_aranges del archivo DWARF para localizar el desplazamiento 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

Anote el valor DW_AT_ranges de 0x0000000c. En el depurador, use ese valor de desplazamiento y el nombre de módulo de DisplayGreeting para mostrar la información del símbolo 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

El comando !dieancestry se comporta de forma similar a !die excepto en que recorre el árbol DIE hacia la compilación u unidad de tipo que lo contiene, en lugar de hacia abajo en el árbol.

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

-r#: volcado de N niveles recursivamente.

Proporcione un -m <module base expression> que proporcione la dirección base de cualquier módulo que esté consultando.

<offset expression> es el tamaño del desplazamiento DIE.

Ejemplo:

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       

Tenga en cuenta que se puede hacer clic en los vínculos, por ejemplo en los principales o del mismo nivel, para poder seguir recorriendo el árbol de símbolos 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'

...
   

No se muestra toda la salida.

!dwunwind

!dwunwind es parecido a .fnent (Mostrar datos de función) para las imágenes PE. Muestra las reglas de desenredado DWARF para una dirección especificada por la expresión. También es similar al comando readelf --unwind, que muestra información de desenredado, cuando está disponible.

!dwunwind <expression>

Este ejemplo muestra las reglas de desenredado para la función GetCppConGreeting en el programa 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

Esto muestra la pila de desenredado para el registro del puntero de instrucción.

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

Este es un ejemplo de contador de programa.

   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

Vuelca el árbol DIE para un módulo especificado en un nivel de recursividad especificado, similar a ejecutar dwarfdump o llvm-dwarfdump en los símbolos y encontrar el DIE.

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

-r#: especificar el nivel de recursividad

-t: vuelque .debug_types y no .debug_info

La base del módulo que contiene el DIE debe indicarse mediante la opción -m <expression>.

<offset expression> es el tamaño del desplazamiento DIE.

Ejemplo:

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  

Use la opción -r2 para mostrar valores adicionales en 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'

...

No se muestra toda la salida. Tenga en cuenta que se puede hacer clic en los vínculos, por ejemplo en los de mismo nivel, para poder seguir recorriendo el árbol de símbolos DWARF.

!dielocal

Localiza el DIE para la variable local llamada "name" y realiza un volcado de diagnóstico del DIE similar a ejecutar dwarfdump o llvm-dwarfdump en los símbolos y encontrar el DIE.

!dielocal [options] <name>

-r#: volcado de N niveles recursivamente. Normalmente, este es uno y solo se vuelca el propio DIE.

<name>: variable local denominada "name".

Ejemplo:

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) 

Consulte también

Acceso extendido de código fuente

ELFUTILS debuginfod

DWARF Versión 5

Uso de símbolos

!sym

Volcados de memoria de Linux

Depuración de procesos remotos en vivo de Linux