Linux sembolleri ve kaynakları

Bu makalede WinDbg'nin standart Linux sembollerini ve kaynaklarını nasıl desteklediği açıklanmaktadır. Linux'ta hata ayıklama desteği için WinDbg sürüm 1.2402.24001.0 veya üzeri gerekir.

DebugInfoD sembol sunucuları

Window hata ayıklayıcısı, Linux için derleme yapıtlarının otomatik olarak indirilmesi için DebugInfoD standardını kullanır. DebugInfoD, Microsoft'un sembol sunucusu ve kaynak sunucu teknolojilerinin bir bileşimidir. Derleme tanımlayıcısına göre üç nesne türünün (yürütülebilir dosyalar (ELF), DWARF hata ayıklama bilgileri ve kaynak kod) otomatik olarak indirilmesine olanak tanır. Linux'un çeşitli dağıtımları, nesne türlerinden bazılarını sağlayan kendi DebugInfoD sunucularını artık barındırıyor. Çeşitli DebugInfoD sunucuları ELFUTILS https://debuginfod.elfutils.orgadresinde listelenmiştir.

DebugInfoD hakkında genel bilgileri burada bulabilirsiniz:

DebugInfoD* etiketi, her bir sunucu URL'si https://domain.com biçiminde biçimlendirilmiş ve * ile ayrılmış olarak bir veya daha fazla DebugInfoD sunucusuna işaret edebilir. Sunucular, kaynak yolda listelenen sırayla aranacak ve dosyalar eşleşen ilk URL'den alınacaktır.

Örneğin, simge yolunu şöyle ayarlayabilirsiniz.

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

!sym noisy Simge yükleme hakkındaki bilgileri görüntülemek için komutunu kullanın. Daha fazla bilgi için bkz. !sym.

Kaynak yol komutu (.srcpath, .lsrcpath (Kaynak Yolu Ayarla)) etiketi aracılığıyla DebugInfoD* DebugInfoD sunucularından dosya almayı destekler ve bu da kaynak kod yapıtlarının alınmasını sağlar. Örneğin, kaynak yolu şöyle ayarlayabilirsiniz.

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

Daha fazla bilgi için bkz. Kaynak Kodu Genişletilmiş Erişim.

DWARF sembolleri

DWARF yaygın olarak kullanılan, standartlaştırılmış bir hata ayıklama veri biçimidir. CÜCE ilk olarak Yürütülebilir ve Bağlanabilir Biçim (ELF) ile birlikte tasarlanmıştır, ancak nesne dosyası biçimlerinden bağımsızdır. Daha fazla bilgi için bkz. https://en.wikipedia.org/wiki/DWARF ve sürüm 5 standardı için bkz. DWARF Versiyon 5.

DWARF sembol versiyonunu belirlemek için objdump komutunu kullanın. Bu örnekte, sürüm 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

WinDbg DWARF Desteği

WinDbg, DWARF ve ELF kullanımını aşağıdaki şekillerde destekler.

  • Linux Kullanıcı Modu - Linux ELF Çekirdek Dökümlerini (-z <core dump>) açma ve tam özel DWARF sembolleriyle ölüm sonrası hata ayıklama ve analiz yapma.

  • Linux Çekirdek Modu - Linux Çekirdeği (ELF VMCORE) dökümlerini açma ve tam özel DWARF sembolleriyle hata ayıklama ve analiz yapma.

  • Linux Çekirdek Modu - Linux Çekirdeği sıkıştırılmış KDUMP'leri açarak ve tam özel DWARF sembolleriyle hata ayıklaması ve analiz yapması (WinDbg yalnızca ZLIB sıkıştırılmış KDUMP dosyalarını destekler. LZO ve Snappy sıkıştırılmış KDUMP'ler desteklenmez.)

  • ELF Görüntülerini (-z <ELF image>) açma ve içerikleri inceleme, ayrıştırma vb.

  • Diğer Senaryolar - Karışık PE/ELF ortamlarında ELF görüntülerini ve DWARF sembollerini anlama (örneğin: Windows'a yüklenen Open Enclave bileşenlerinde hata ayıklama. Daha fazla bilgi için bkz Open Enclave hata ayıklama.)

WinDbg GDBServer Linux desteği

GNU Hata Ayıklayıcısı, GDBServer, WinDbg bağlantısını desteklemek için Linux üzerinde kullanılır. GDBServer hakkında daha fazla bilgi için bkz https://en.wikipedia.org/wiki/Gdbserver. . Uzak gdb hata ayıklama belgelerini görüntülemek için burada bir yer vardır - https://sourceware.org/gdb/current/onlinedocs/gdb#Remote-Debugging

Daha fazla bilgi için WinDbg ve kod kılavuzu ile GDBServer kullanma hakkında bkz. Linux canlı uzaktan işlem hata ayıklama. Buradaki örneklerde Linux için Windows Alt Sistemi (WSL) altında çalışan Ubuntu kullanılmaktadır ancak diğer Linux uygulamaları da kullanılabilir.

DWARF Uygulaması

DWARF sembolleri, orijinal imajın içine (hata ayıklama binary'si) gömülü veya ayrı bir ELF imajına (hata ayıklama paketi) ayrılmış olarak desteklenir.

Linux DWARF yığın izlemesinin başarılı olması için, Linux işlemine yüklenen herhangi bir modülün özgün ikili görüntüsünün bulunabilmesi gerekir.

DWARF sembolleri/ELF görüntüleri (soyulmuş veya soyulmamış) hata ayıklayıcının sembol yolu veya sembol sunucusu aracılığıyla bulunabilir (GNU Derleme Kimliği karmasına göre .NET Core için dizinlenmiştir).

DWARF sembolleri, Linux tarzı hata ayıklama paketi yüklenerek bulunabilir. Bu, sembol yolunda adlı .build-id bir dizin tarafından verilir. Bunun altında, GNU Derleme Kimliği karmasının ilk baytına göre adlandırılmış dizinler bulunmaktadır. Bu tür dizinlerin altında .debug adlı <remaining 18 bytes of GNU Build ID hash>bir dosya bulunur.

Hata ayıklayıcı CÜCE simgelerini açtığında, biçimin kendisi gerekli arama tablolarını içermediğinden ilk dizin oluşturma adımını gerçekleştirir. Büyük CÜCE sembol kümeleri için (ör. Linux çekirdeği için özel CÜCE bilgileri), bu işlem 10 - 30 saniye sürebilir.

Bilinen depo/commit'ten otomatik kaynak alma için !addsourcemap

Bilinen bir depo ve işlemeden oluşturulan bileşenlerde hata ayıklarsanız, bir uzantısı vardır, !addsourcemaphata ayıklayıcısı komutu hata ayıklayıcıya belirli bir modül ve yol için bilinen bir URL'den kaynakları otomatik olarak almak istediğinizi söylemenizi sağlar. Uzantının kullanımı:

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

Nerede:

<module> , ilgilendiğim modülün adıdır.

<local spec> , bir URL aracılığıyla aranacak olan bu modüldeki kaynakların yoludur. Bu yol joker karakterle bitmelidir.

<remote spec> , eşleşen <local spec> dosyaların aranacağı URL'dir. Bu yol, <local spec> içindeki joker karakterin belirli bir kaynak yolla nasıl eşleştiğine göre değiştirilecek olan bir joker karakterle bitmelidir.

Kaynak haritayı ayarlamak için modülün lm (Yüklenen Modülleri Listele) kullanarak mevcut olduğunu onaylayın. Ardından kaynağın uzak konumunu belirleyin.

Bu örnek, vmlinux modülünü GitHub'da kullanılabilen belirli bir derlemeye ayarlar.

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

Sourcemap komutu verildikten sonra, kaynak yüklemesini tetikleyen birçok şey vardır, örneğin, .reload komutunu kullanarak veya çerçeveler arasında ileri geri geçiş yaparak yeniden yükleme gerçekleştirmek gibi. Bundan sonra GitHub'dan otomatik bir kaynak çekme gerçekleşir.

!sourcemaps

!sourcemaps Mevcut kaynak eşlemeleri listelemek için komutunu kullanın.

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

!removesourcemaps

Mevcut bir kaynak eşlemeyi kaldırmak için !removesourcemaps komutunu kullanın.

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

DWARF sembollerinin sorunlarını giderme

Linux/Android dökümlerinde (veya CÜCE sembolleri kullanan diğer hedeflerde) hata ayıklarsanız, yerel değişkenlerin, tür tanımlarının veya işlev tanımlarının neden yanlış olduğunu anlamak için simgelerin ham içeriğine bakmak isteyebilirsiniz. Bunu yapmak için hata ayıklayıcının, DWARF sembollerinin ham içeriğini dökümü için bazı yerleşik uzantı komutları vardır. Ayrıca, sembol iç bilgilerini görüntülemek için readelf ve dumpdwarf gibi Linux yardımcı programlarını kullanın.

readelf komutu

Linux canlı uzaktan işlem hata ayıklamasında oluşturulan örnek DisplayGreeting programı için oluşturulan hata ayıklama derleme kimliğini görüntülemek için Linux komut istemindeki readelf komutunu kullanın. Bu örnekte, aba822dd158b997b09903d4165f3dbfd37f5e5c1 derleme kimliği döndürülür.

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, sembol sürümünü döndürmek için grep ile kullanılabilir.

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

dwarfdump

dwarfdump Linux komutu, belirli seçenekler tarafından istenen DWARF bölümlerini yazdırır veya kontrol eder. Birçok seçeneği görüntülemek için dwarfdump -h kullanın.

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

Ubuntu'da dwarfdump kullanma hakkında daha fazla bilgi için bkz dwarfdump.

!diesym

Bu hata ayıklayıcı komutu, belirtilen ifadede (adres, işlev adı vb.) bulunan simge için isteğe bağlı olarak belirtilen özyineleme düzeyine sahip DIE (veya DIE alt ağacı) görüntüler. Verilen bir adreste yer alan sembol (genellikle fonksiyon ama veri vb. de olabilir) için DEİ'yi bulur ve sembollerde dwarfdump veya llvm-dwarfdump çalıştırmaya benzer şekilde DEİ'nin tanılama dökümünü gerçekleştirir.

!diesym [options] <expression>

-r# : N düzeyini özyinelemeli olarak çıkart. Normalde, bu birdir ve sadece DIE'nin kendisi atılır.

<expression> - DIE'yi bulmak için adres bir ifade tarafından verilir. Düz bir onaltılık adres (0x<blah>) veya başka bir şekilde benzersiz bir işlev adı olabilir.

Veri modelinin standart değerlendirmesi tarafından değerlendirilebilir olması gerekir. Model ifadesinin doğrulanması için dx komutunu kullanın. dx komutunu kullanma hakkında daha fazla bilgi için bkz. dx (Debugger Nesne Modeli İfadesini Görüntüle).

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

Örnek DisplayGreeting programı için, GetCppConGreeting işlevinin DIE sembol bilgilerini görüntüleyin.

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)

Ek bir DIE simgesi bilgisi düzeyi görüntülemek için -r2 seçeneğini kullanın.

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) 

!ölmek

!die , DWARF hata ayıklama bölümünde belirtilen ofset ifadesindeki DIE (veya DIE alt ağacı) için, isteğe bağlı olarak belirlenen bir özyineleme düzeyine sahip görüntüleme yapar.

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

-r# : N düzeyini özyinelemeli olarak çıkart.

-t : DIE, .debug_info içindeki bir derleme birimi yerine .debug_types içinde bir tür birimi içindeyse, -t seçeneğini belirtmeniz gerekir.

Sorguladığınız modülün temel adresini veren bir -m <module base expression> sağlayın.

<offset expression>, DIE ofsetinin boyutudur.

Linux komut isteminde, DIE uzaklığını bulmak için DWARF dosyasının .debug_aranges bölümünü yazdırmak üzere -r ile dwarfdump kullanın.

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

DW_AT_ranges değerini 0x0000000c not edin. Hata ayıklayıcıda, DIE sembol bilgilerini görüntülemek için bu uzaklık değerini ve DisplayGreeting modül adını kullanın.

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

Komut !dieancestry, !die gibi davranır, ancak DIE ağacını içeren derleme veya tür birimine doğru yukarı çıkar, ağaçtan aşağı değil.

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

-r# : N düzeyini özyinelemeli olarak çıkart.

Sorguladığınız modülün temel adresini veren bir -m <module base expression> sağlayın.

<offset expression>, DIE ofsetinin boyutudur.

Örnek:

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       

Örneğin, ebeveynlere veya kardeşlere yönelik bağlantıların, DWARF sembol ağacında daha fazla dolaşıma izin vermek için tıklanabilir olduğunu unutmayın.

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'

...
   

Tüm çıkışlar gösterilmez.

!dwunwind

!dwunwind PE görüntüleri için .fnent 'e (İşlev verilerini görüntüle) benzer. Verilen ifadeye bağlı olarak bir adres için DWARF geri sarma kurallarını görüntüler. Kullanılabilir olduğunda geri sarma bilgilerini görüntüleyen readelf --unwind komutuna da benzer.

!dwunwind <expression>

Bu örnek, DisplayGreeting programında GetCppConGreeting işlevinin geri sarma kurallarını görüntüler.

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

Bu, yönerge işaretçisi yazmaç için geri sarma yığınını görüntüler.

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

Burada bir program sayacı örneği verilmiştir.

   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

Belirli bir modülün DIE ağacını, dwarfdump veya llvm-dwarfdump komutunu çalıştırarak DIE'yi bulmaya benzer şekilde belirli bir özyineleme düzeyinde dökümünü alır.

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

-r# : Özyineleme düzeyini belirtin

-t : .debug_info yerine .debug_types dökümü yapın

DIE içeren modül için modül tabanı, -m <expression> seçeneği ile belirtilmelidir.

<offset expression>, DIE ofsetinin boyutudur.

Örnek:

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  

Dietree'de ek değerleri görüntülemek için -r2 seçeneğini kullanın.

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'

...

Tüm çıkışlar gösterilmez. Örneğin eşdüzeylere yönelik bağlantıların, CÜCE sembol ağacının daha fazla geçişine izin vermek için tıklanabilir olduğunu unutmayın.

!dielocal

"Name" adlı yerel değişken için DIE'yi bulur ve semboller üzerinde dwarfdump veya llvm-dwarfdump çalıştırmaya benzer bir şekilde DIE'nin tanılama dökümünü gerçekleştirir.

!dielocal [options] <name>

-r# : N düzeyini özyinelemeli olarak çıkart. Normalde, bu birdir ve sadece DIE'nin kendisi atılır.

<name> : "name" adlı yerel değişken.

Örnek:

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) 

Ayrıca bakınız

Kaynak Kodu Genişletilmiş Erişimi

ELFUTILS debuginfod

DWARF Sürüm 5

Sembolleri Kullanma

!Sym

Linux çökme dökümleri

Linux canlı uzaktan işlem hata ayıklama