Bagikan melalui


Simbol dan sumber Linux

Artikel ini menjelaskan bagaimana WinDbg mendukung simbol dan sumber Linux standar. Dukungan untuk penelusuran kesalahan di Linux memerlukan WinDbg versi 1.2402.24001.0 atau lebih tinggi.

Server simbol DebugInfoD

Debugger Jendela menggunakan standar DebugInfoD untuk pengunduhan otomatis artefak build untuk Linux. Sebanding, DebugInfoD adalah kombinasi dari server simbol Microsoft dan teknologi server sumber. Ini memungkinkan pengunduhan tiga jenis artefak secara otomatis (executables (ELF), info debug (DWARF), dan sumber (kode) berdasarkan build-id. Berbagai distribusi Linux sekarang menghosting server DebugInfoD mereka sendiri yang menyediakan beberapa jenis artefak. Berbagai server DebugInfoD tercantum di ELFUTILS https://debuginfod.elfutils.org.

Informasi umum tentang DebugInfoD tersedia di sini:

Tag DebugInfoD* dapat menunjuk ke satu atau beberapa server DebugInfoD dengan setiap URL server diformat sebagai https://domain.com dan dipisahkan oleh *. Server akan dicari dalam urutan yang sama seperti yang tercantum di jalur sumber dan file akan diambil dari URL pertama yang cocok.

Misalnya, Anda dapat mengatur jalur simbol seperti ini.

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

!sym noisy Gunakan perintah untuk menampilkan informasi tentang pemuatan simbol. Untuk informasi selengkapnya, lihat !sym.

Perintah jalur sumber (.srcpath, .lsrcpath (Set Source Path)) mendukung pengambilan file dari server DebugInfoD melalui DebugInfoD* tag, yang memungkinkan pengambilan artefak kode sumber. Misalnya, Anda dapat mengatur jalur sumber, seperti ini.

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

Untuk informasi selengkapnya, lihat Kode Sumber Akses yang Diperluas.

Simbol DWARF

DWARF adalah format data debugging standar yang banyak digunakan. DWARF awalnya dirancang bersama dengan Executable dan Linkable Format (ELF), meskipun tidak bergantung pada format file objek. Untuk informasi selengkapnya, lihat https://en.wikipedia.org/wiki/DWARF dan untuk standar versi 5, lihat DWARF Versi 5.

Gunakan perintah dump objek untuk menentukan versi simbol DWARF. Dalam contoh ini, versi 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

Dukungan WinDbg DWARF

WinDbg mendukung penggunaan DWARF dan ELF berikut.

  • Mode Pengguna Linux - Membuka Linux ELF Core Dumps (-z <core dump>) dan melakukan debugging dan analisis pasca-mortem dengan simbol DWARF privat penuh.

  • Mode Kernel Linux - Membuka Cadangan Linux Kernel (ELF VMCORE) dan melakukan debugging dan analisis pasca-mortem dengan simbol DWARF privat penuh.

  • Mode Kernel Linux - Membuka KDUMP terkompresi Kernel Linux dan melakukan penelusuran kesalahan dan analisis pasca-mortem dengan simbol DWARF privat penuh (WinDbg hanya mendukung file KDUMP terkompresi ZLIB. LZO dan KDUMP terkompresi Snappy tidak didukung.)

  • Membuka Gambar ELF (-z <ELF image>) dan memeriksa konten, pembongkaran, dll.

  • Skenario Lain - Memahami gambar ELF dan simbol DWARF di lingkungan PE/ELF campuran (misalnya: men-debug komponen Open Enclave yang dimuat di Windows. Untuk informasi selengkapnya, lihat Membuka penelusuran kesalahan Enklave.)

Dukungan WinDbg GDBServer Linux

Debugger GNU, GDBServer digunakan di Linux untuk mendukung koneksi WinDbg. Untuk informasi selengkapnya tentang GDBServer, lihat https://en.wikipedia.org/wiki/Gdbserver. Satu tempat untuk melihat dokumentasi untuk penelusuran kesalahan gdb jarak jauh ada di sini - https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging

Untuk informasi selengkapnya, tentang menggunakan GDBServer dengan WinDbg dan panduan kode, lihat Debugging proses jarak jauh langsung Linux. Contoh di sini menggunakan Ubuntu yang berjalan di bawah Subsistem Windows untuk Linux (WSL), tetapi implementasi Linux lainnya juga dapat digunakan.

Implementasi DWARF

Simbol DWARF didukung yang disematkan dalam gambar asli (biner debug) atau dilucuti menjadi gambar ELF terpisah (paket debug).

Agar tumpukan Linux DWARF berjalan berhasil, gambar biner asli untuk modul apa pun yang dimuat ke dalam proses Linux harus dapat ditemukan.

Simbol DWARF/gambar ELF (dilucuti atau tidak) dapat ditemukan melalui simpati debugger atau server simbol (diindeks sesuai .NET Core melalui hash ID Build GNU).

Simbol DWARF dapat ditemukan melalui penginstalan paket debug gaya Linux. Hal ini diberikan oleh direktori bernama .build-id di jalur simbol. Di bawah ini adalah direktori bernama sesuai dengan byte pertama dari hash ID Build GNU. Di bawah setiap direktori tersebut adalah file bernama <remaining 18 bytes of GNU Build ID hash>.debug.

Ketika debugger membuka simbol DWARF, debugger melakukan langkah pengindeksan awal karena format itu sendiri tidak menyertakan tabel pencarian yang diperlukan. Untuk set besar simbol DWARF (misalnya: informasi DWARF privat untuk kernel Linux), ini mungkin memakan waktu 10 - 30 detik.

!addsourcemap untuk pengambilan sumber otomatis dari repositori/penerapan yang diketahui

Jika Anda men-debug komponen yang dibangun dari repositori dan penerapan yang diketahui, ada ekstensi, !addsourcemap, perintah debugger memungkinkan Anda untuk memberi tahu debugger bahwa untuk modul dan jalur tertentu, Anda ingin secara otomatis mengambil sumber dari URL yang diketahui. Penggunaan ekstensi adalah:

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

Mana:

<module> adalah nama modul yang menarik.

<local spec> adalah jalur sumber dalam modul tersebut yang akan dicari melalui URL. Jalur ini harus berakhir dengan kartubebas.

<remote spec> adalah URL tempat file yang cocok <local spec> akan dicari. Jalur ini harus berakhir dengan kartubebas yang akan diganti dengan bagaimana kartubebas yang <local spec> cocok dengan jalur sumber tertentu.

Untuk mengatur peta sumber, konfirmasikan bahwa modul ada menggunakan lm (Daftar Modul yang Dimuat). Kemudian tentukan lokasi sumber jarak jauh.

Contoh ini mengatur modul vmlinux ke build tertentu yang tersedia di 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

Setelah perintah peta sumber diterbitkan, sejumlah hal akan memicu beban sumber, misalnya mengalihkan bingkai bolak-balik atau memuat ulang, menggunakan perintah .reload. Setelah itu, dan tarikan sumber otomatis dari GitHub akan terjadi.

!sourcemaps

!sourcemaps Gunakan perintah untuk mencantumkan peta sumber yang ada.

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

!removesourcemaps

!removesourcemaps Gunakan perintah untuk menghapus peta sumber yang ada.

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

Pemecahan masalah simbol DWARF

Jika Anda men-debug cadangan Linux/Android (atau target lain yang menggunakan simbol DWARF), Anda mungkin ingin melihat konten mentah simbol untuk memahami mengapa variabel lokal, definisi jenis, atau definisi fungsi salah. Untuk melakukan ini, debugger memiliki beberapa perintah ekstensi bawaan untuk membuang konten mentah simbol DWARF. Selain itu, gunakan utilitas Linux seperti readelf dan dumpdwarf untuk menampilkan informasi internal simbol.

perintah readelf

Gunakan perintah readelf di prompt perintah Linux untuk menampilkan ID build debug yang dibuat untuk sampel program DisplayGreeting yang dibuat di debugging proses jarak jauh langsung Linux. Dalam contoh ini, ID build aba822dd158b997b09903d4165f3dbfd37f5e5c1 dikembalikan.

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 dapat digunakan dengan grep untuk mengembalikan versi simbol.

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

dwarfdump

Perintah dwarfdump linux mencetak atau memeriksa bagian DWARF seperti yang diminta oleh opsi tertentu. Gunakan dwarfdump -h untuk melihat banyak opsi.

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

Untuk informasi selengkapnya tentang menggunakan dwarfdump di Ubuntu, lihat dwarfdump .

!diesym

Perintah debugger ini akan menampilkan DIE (atau subtree DIE) untuk simbol apa pun pada ekspresi yang diberikan (dapat berupa alamat, nama fungsi, dll.) dengan tingkat rekursi yang ditentukan secara opsional. Ini menemukan DIE untuk simbol (biasanya berfungsi tetapi bisa berupa data, dll...) yang terkandung pada alamat tertentu dan melakukan dump diagnostik DIE yang mirip dengan menjalankan dwarfdump atau llvm-dwarfdump pada simbol dan menemukan DIE.

!diesym [options] <expression>

-r# : tingkat N cadangan secara rekursif. Biasanya, ini adalah satu dan hanya DIE itu sendiri yang dibuang.

<expression> - Alamat untuk menemukan DIE diberikan oleh ekspresi. Ini mungkin alamat heksa datar (0x<blah>) atau mungkin nama fungsi yang unik.

Ini perlu dievaluasi oleh evaluasi standar model data. Gunakan perintah dx untuk memvalidasi bahwa ekspresi model. Untuk informasi selengkapnya tentang menggunakan perintah dx, lihat dx (Ekspresi Model Objek Debugger Tampilan).

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

Tampilkan informasi simbol DIE untuk sampel program DisplayGreeting, fungsi 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)

Gunakan opsi -r2 untuk menampilkan tingkat informasi simbol DIE tambahan.

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) 

!Mati

!die akan menampilkan DIE (atau die subtree) untuk die apa pun pada ekspresi offset yang diberikan dalam bagian debug DWARF dengan tingkat rekursi yang ditentukan secara opsional.

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

-r# : tingkat N cadangan secara rekursif.

-t : Jika DIE berada dalam unit jenis di .debug_types alih-alih unit kompilasi dalam .debug_info, Anda harus menentukan sakelar -t.

Berikan yang -m <module base expression> memberikan alamat dasar modul apa pun yang Anda kueri.

adalah <offset expression> ukuran offset DIE.

Pada prompt Linux, gunakan dwarfdump dengan -r untuk mencetak bagian .debug_aranges file DWARF untuk menemukan 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

Perhatikan nilai DW_AT_ranges dari 0x0000000c. Dalam debugger gunakan nilai offset tersebut dan nama modul DisplayGreeting untuk menampilkan informasi simbol 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

!dieancestry Perintah berperilaku mirip !die kecuali berjalan di atas pohon DIE ke arah kompilasi yang berisi atau unit jenis, alih-alih menuruni pohon.

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

-r# : tingkat N cadangan secara rekursif.

Berikan yang -m <module base expression> memberikan alamat dasar modul apa pun yang Anda kueri.

adalah <offset expression> ukuran offset DIE.

Contoh:

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       

Perhatikan bahwa tautan, misalnya kepada orang tua atau saudara kandung, dapat diklik untuk memungkinkan traversal lebih lanjut dari pohon simbol 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'

...
   

Tidak semua output ditampilkan.

!dwunwind

!dwunwind agak mirip dengan .fnent (Tampilkan data fungsi) untuk gambar PE. Ini menampilkan aturan unwind DWARF untuk alamat yang diberikan oleh ekspresi. Ini juga mirip dengan perintah readelf --unwind, yang menampilkan informasi unwind, ketika tersedia.

!dwunwind <expression>

Contoh ini menampilkan aturan unwind untuk fungsi GetCppConGreeting dalam program 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

Ini menampilkan tumpukan unwind untuk register pointer instruksi.

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

Berikut adalah contoh penghitung program.

   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

Mencadangkan pohon DIE untuk modul tertentu pada tingkat rekursi tertentu yang mirip dengan menjalankan dwarfdump atau llvm-dwarfdump pada simbol dan menemukan DIE.

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

-r# : Tentukan tingkat rekursi

-t : Buang .debug_types dan bukan .debug_info

Basis modul untuk modul yang berisi DIE harus diberikan oleh -m <expression> opsi .

adalah <offset expression> ukuran offset DIE.

Contoh:

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  

Gunakan opsi -r2 untuk menampilkan nilai tambahan dalam 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'

...

Tidak semua output ditampilkan. Perhatikan bahwa tautan, misalnya ke saudara kandung, dapat diklik untuk memungkinkan traversal lebih lanjut dari pohon simbol DWARF.

!dielocal

Menemukan DIE untuk variabel lokal bernama "name" dan melakukan dump diagnostik DIE yang mirip dengan menjalankan dwarfdump atau llvm-dwarfdump pada simbol dan menemukan DIE.

!dielocal [options] <name>

-r# : tingkat N cadangan secara rekursif. Biasanya, ini adalah satu dan hanya DIE itu sendiri yang dibuang.

<name> : variabel lokal bernama "name".

Contoh:

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) 

Lihat juga

Akses Yang Diperluas Kode Sumber

Debuginfod ELFUTILS

DWARF Versi 5

Menggunakan Simbol

!Sym