Simboli e origini Linux
Questo articolo descrive come WinDbg supporta simboli e origini Linux standard. Il supporto per il debug in Linux richiede WinDbg versione 1.2402.24001.0 o successiva.
Server di simboli DebugInfoD
Il debugger window usa lo standard DebugInfoD per il download automatico degli artefatti di compilazione per Linux. DebugInfoD è una combinazione di tecnologie server di simboli e server di origine di Microsoft. Consente di scaricare automaticamente tre tipi di artefatti (eseguibili (ELF), informazioni di debug (NANO) e origine (codice) in base all'ID di compilazione. Varie distribuzioni di Linux ora ospitano i propri server DebugInfoD che forniscono alcuni tipi di artefatto. I vari server DebugInfoD sono elencati in ELFUTILS https://debuginfod.elfutils.org.
Informazioni generali su DebugInfoD sono disponibili qui:
Il DebugInfoD*
tag può puntare a uno o più server DebugInfoD con ogni URL del server formattato https://domain.com
come e separato da *
. I server verranno cercati nello stesso ordine indicato nel percorso di origine e i file verranno recuperati dal primo URL corrispondente.
Ad esempio, è possibile impostare il percorso del simbolo in questo modo.
.sympath+ DebugInfoD*https://debuginfod.elfutils.org
Usare il !sym noisy
comando per visualizzare informazioni sul caricamento dei simboli. Per altre informazioni, vedere !sym.
Il comando percorso di origine (.srcpath, .lsrcpath (Set Source Path)) supporta il recupero di file dai server DebugInfoD tramite il DebugInfoD*
tag , che consente il recupero degli artefatti del codice sorgente. Ad esempio, è possibile impostare il percorso di origine, come illustrato di seguito.
.srcpath+ DebugInfoD*https://debuginfod.elfutils.org
Per altre informazioni, vedere Accesso esteso al codice sorgente.
Simboli NANI
DWARF è un formato di dati di debug standardizzato ampiamente usato. NANO è stato originariamente progettato insieme a Executable e Linkable Format (ELF), anche se è indipendente dai formati di file oggetto. Per altre informazioni, vedere https://en.wikipedia.org/wiki/DWARF e per la versione 5 standard, vedere NANO Versione 5.
Usare il comando object dump per determinare la versione del simbolo DWARF. In questo esempio, versione 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
Supporto di WinDbg DWARF
WinDbg supporta gli usi seguenti di NANO ed ELF.
Modalità utente Linux: apertura di dump core ELF Linux (
-z <core dump>
) e esecuzione di debug e analisi post-mortem con simboli NANi privati completi.Modalità kernel Linux: apertura di dump del kernel Linux (ELF VMCORE) e esecuzione di debug e analisi post-mortem con simboli NANi privati completi.
Modalità kernel Linux: apertura di KDUMPs compressi del kernel Linux e esecuzione di debug e analisi post-mortem con simboli NANi privati completi (WinDbg supporta solo i file KDUMP compressi ZLIB. LZO e Snappy compressi KDUMP non sono supportati.
Apertura di immagini ELF (
-z <ELF image>
) ed esame del contenuto, disassembly e così via.Altri scenari : informazioni sulle immagini ELF e sui simboli NANO in ambienti PE/ELF misti, ad esempio il debug dei componenti Open Enclave caricati in Windows. Per altre informazioni, vedere Debug open enclave.
Supporto di WinDbg GDBServer Linux
Il debugger GNU, GDBServer viene usato in Linux per supportare la connessione WinDbg. Per altre informazioni su GDBServer, vedere https://en.wikipedia.org/wiki/Gdbserver. Una posizione in cui visualizzare la documentazione per il debug remoto di gdb è disponibile qui: https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging
Per altre informazioni sull'uso di GDBServer con WinDbg e una procedura dettagliata per il codice, vedere Debug di processi remoti live linux. Gli esempi qui usano Ubuntu in esecuzione nel sottosistema Windows per Linux (WSL), ma è possibile usare anche altre implementazioni di Linux.
Implementazione DI NANO
I simboli NANO sono supportati nell'immagine originale (un file binario di debug) o rimossi in un'immagine ELF separata (un pacchetto di debug).
Affinché lo stack NANO Linux abbia esito positivo, è necessario trovare l'immagine binaria originale per qualsiasi modulo caricato nel processo Linux.
I simboli NANi/immagini ELF (rimosse o meno) possono essere trovati tramite il sympath del debugger o il server di simboli (indicizzato come per .NET Core tramite l'hash GNU Build ID).
I simboli NANO sono disponibili tramite un'installazione del pacchetto di debug in stile Linux. Tali dati sono specificati da una directory denominata .build-id
nel percorso del simbolo. In questa sono directory denominate in base al primo byte dell'hash DELL'ID di compilazione GNU. In ogni directory di questo tipo è un file denominato <remaining 18 bytes of GNU Build ID hash>
.debug.
Quando il debugger apre i simboli NANO, esegue un passaggio di indicizzazione iniziale perché il formato stesso non include le tabelle di ricerca necessarie. Per grandi set di simboli NANO (ad esempio: informazioni NANO private per il kernel Linux), l'operazione può richiedere da 10 a 30 secondi.
!addsourcemap per il recupero automatico dell'origine da repository/commit noti
Se si esegue il debug di componenti compilati da un repository noto e si esegue il commit, è presente un'estensione, !addsourcemap
il comando debugger consente di indicare al debugger che per un determinato modulo e percorso si desidera recuperare automaticamente le origini da un URL noto. L'utilizzo dell'estensione è:
!addsourcemap <module> <local spec> <remote spec>
Dove:
<module>
è il nome del modulo di interesse.
<local spec>
è il percorso delle origini all'interno di tale modulo che verrà cercato tramite un URL. Questo percorso deve terminare con un carattere jolly.
<remote spec>
è l'URL in cui verranno cercati i file corrispondenti <local spec>
. Questo percorso deve terminare con un carattere jolly che verrà sostituito con il modo in cui il carattere jolly in <local spec>
corrisponde a un determinato percorso di origine.
Per impostare la mappa di origine, verificare che il modulo sia presente usando lm (Elenca moduli caricati).To set the sourcemap, confirm that the module is present using lm (List Loaded Modules). Determinare quindi la posizione remota dell'origine.
Questo esempio imposta il modulo vmlinux su una build specifica disponibile in 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
Dopo l'esecuzione del comando sourcemap, un certo numero di operazioni attiverà un carico di origine, ad esempio cambiando i fotogrammi avanti e indietro o ricaricando, usando il comando .reload. Successivamente, si verificherà un pull automatico di origine da GitHub.
!sourcemaps
Usare il !sourcemaps
comando per elencare le mappe di origine esistenti.
0:000> !sourcemaps
Source maps for vmlinux.6:
/build/linux/* -> https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
!removesourcemaps
Usare il !removesourcemaps
comando per rimuovere una mappa di origine esistente.
0:000> !removesourcemaps vmlinux /build/linux/* https://raw.githubusercontent.com/torvalds/linux/6e61dde82e8bfe65e8ebbe43da45e615bc529236/
1 source maps successfully removed
Risoluzione dei problemi relativi ai simboli NANO
Se si esegue il debug di dump Linux/Android (o altre destinazioni che usano simboli NANO), è possibile esaminare il contenuto non elaborato dei simboli per comprendere perché le variabili locali, le definizioni dei tipi o le definizioni di funzione non sono corrette. A tale scopo, il debugger dispone di alcuni comandi di estensione predefiniti per eseguire il dump del contenuto non elaborato dei simboli NANO. Usare anche utilità Linux, ad esempio readelf e dumpdwarf, per visualizzare informazioni interne sui simboli.
Comando readelf
Usare il comando readelf al prompt dei comandi di Linux per visualizzare l'ID di compilazione di debug creato per il programma DisplayGreeting di esempio creato nel debug del processo remoto live linux. In questo esempio viene restituito un ID di compilazione aba822dd158b997b0903d4165f3dbfd37f5e5c1.
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 può essere usato con grep per restituire la versione del simbolo.
readelf --debug-dump=info DisplayGreeting | grep -A 2 'Compilation Unit @'
Compilation Unit @ offset 0x0:
Length: 0x285c (32-bit)
Version: 5
nanodump
Il comando nanodump linux stampa o controlla le sezioni NANO come richiesto da opzioni specifiche. Usare nanodump -h per visualizzare le numerose opzioni.
bob@BOB6:/mnt/c/Users/BOB$ dwarfdump -h
Per altre informazioni sull'uso di nanodump in Ubuntu, vedere nanodump .
!diesym
Questo comando del debugger visualizzerà il sottoalbero DIE (o DIE) per qualsiasi simbolo in corrispondenza dell'espressione specificata (può essere un indirizzo, un nome di funzione e così via) con un livello di ricorsione specificato facoltativamente. Individua l'diE per il simbolo (in genere funzione ma potrebbe essere dati e così via...) contenuto in un determinato indirizzo ed esegue un dump diagnostico dell'ambiente di distribuzione simile all'esecuzione di nanodump o llvm-nanodump sui simboli e alla ricerca dell'diE.
!diesym [options] <expression>
-r#
: dump N livelli in modo ricorsivo. Normalmente, questo è uno e solo l'diE stesso viene scaricato.
<expression>
- L'indirizzo per individuare l'diE viene assegnato da un'espressione. Può trattarsi di un indirizzo esadecimale flat (0x<blah>
) o potrebbe trattarsi di un nome di funzione altrimenti univoco.
Deve essere valutabile dalla valutazione standard del modello di dati. Usare il comando dx per verificare che l'espressione del modello. Per altre informazioni sull'uso del comando dx, vedere dx (Display Debugger Object Model Expression).
0:000> dx DisplayGreeting!GetCppConGreeting
DisplayGreeting!GetCppConGreeting : DisplayGreeting!GetCppConGreeting+0x0 [Type: GetCppConGreeting]
Visualizzare le informazioni sui simboli DIE per il programma DisplayGreeting di esempio, la funzione 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)
Usare l'opzione -r2 per visualizzare un livello aggiuntivo di informazioni sui simboli 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)
!morire
!die
visualizzerà il sottoalbero DIE (o DIE) per l'espressione DIE specificata all'interno della sezione debug NANO con un livello di ricorsione specificato facoltativamente.
!die [-r#] [-t] -m <module base expression> <offset expression>
-r#
: dump N livelli in modo ricorsivo.
-t
: se l'unità di distribuzione è all'interno di un'unità di tipo in .debug_types anziché un'unità di compilazione all'interno di .debug_info, è necessario specificare l'opzione -t.
Specificare un oggetto -m <module base expression>
che fornisce l'indirizzo di base di qualsiasi modulo su cui si sta eseguendo una query.
è <offset expression>
la dimensione dell'offset DIE.
Al prompt di Linux usare nanodump con -r per stampare la sezione .debug_aranges del file NANO per individuare l'offset 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
Si noti il valore DW_AT_ranges di 0x0000000c
. Nel debugger usare tale valore di offset e il nome del modulo DisplayGreeting per visualizzare le informazioni sul simbolo di inserimento delle dipendenze.
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
Il !dieancestry
comando si comporta in modo simile a !die
, ad eccezione del fatto che scorre l'albero DIE verso l'unità di compilazione o di tipo contenitore, anziché verso il basso nell'albero.
!dieancestry [-r#] [-t] -m <module base expression> <offset expression>
-r#
: dump N livelli in modo ricorsivo.
Specificare un oggetto -m <module base expression>
che fornisce l'indirizzo di base di qualsiasi modulo su cui si sta eseguendo una query.
è <offset expression>
la dimensione dell'offset DIE.
Esempio:
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
Si noti che i collegamenti, ad esempio ai genitori o agli elementi di pari livello, sono selezionabili per consentire un ulteriore attraversamento dell'albero dei simboli NANO.
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'
...
Non viene visualizzato tutto l'output.
!dwunwind
!dwunwind
è in qualche modo simile a .fnent (Display function data) per le immagini PE. Visualizza le regole di rimozione NANO per un indirizzo specificato dall'espressione. È anche simile al comando readelf --unwind, che visualizza le informazioni di rimozione, quando è disponibile.
!dwunwind <expression>
In questo esempio vengono visualizzate le regole di rimozione per la funzione GetCppConGreeting nel programma 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
Viene visualizzato lo stack di rimozione per il registro del puntatore all'istruzione.
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
Ecco un esempio di contatore del programma.
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
Esegue il dump dell'albero DIE per un determinato modulo a un determinato livello di ricorsione simile all'esecuzione di nanodump o llvm-nanodump sui simboli e alla ricerca dell'diE.
!dietree [OPTIONS] -m <module base> <offset expression>
-r#
: specificare il livello di ricorsione
-t
: .debug_types dump e non .debug_info
La base del modulo contenente l'diE deve essere fornita dall'opzione -m <expression>
.
è <offset expression>
la dimensione dell'offset DIE.
Esempio:
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
Usare l'opzione -r2 per visualizzare valori aggiuntivi nel 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'
...
Non viene visualizzato tutto l'output. Si noti che i collegamenti, ad esempio a elementi di pari livello, sono selezionabili per consentire un ulteriore attraversamento dell'albero dei simboli NANO.
!dielocal
Individua l'diE per la variabile locale denominata "name" ed esegue un dump di diagnostica dell'die simile all'esecuzione di nanodump o llvm-nanodump sui simboli e alla ricerca dell'diE.
!dielocal [options] <name>
-r#
: dump N livelli in modo ricorsivo. Normalmente, questo è uno e solo l'diE stesso viene scaricato.
<name>
: variabile locale denominata "name".
Esempio:
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)
Vedi anche
Accesso esteso al codice sorgente