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)