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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk