Condividi tramite


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, !addsourcemapil 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

ELFUTILS debuginfod

NANO Versione 5

Uso dei simboli

!Sym

Dump di arresto anomalo di Linux

Debug di processi remoti live linux