Mevcut montaj talimatını GDB'de göster


179

GDB'de montaj düzeyinde hata ayıklama yapıyorum. GDB'yi geçerli montaj talimatını geçerli kaynak satırını gösterdiği gibi göstermesi için bir yol var mı? Her komuttan sonraki varsayılan çıktı şuna benzer:

0x0001433f      990         Foo::bar(p);

Bu bana geçerli talimatın adresini veriyor, ancak disassembleşu anda hangi komutu yürüttüğümü görmek için çıktısına tekrar başvurmaya devam etmeliyim.


Yanıtlar:


315

GDB'de montaj düzenine geçebilirsiniz:

(gdb) layout asm

Daha fazla bilgi için buraya bakın . Mevcut montaj talimatı montajcı penceresinde gösterilecektir.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │0x7ffff740d756 <__libc_start_main+214>  mov    0x39670b(%rip),%rax        #│
   │0x7ffff740d75d <__libc_start_main+221>  mov    0x8(%rsp),%rsi              │
   │0x7ffff740d762 <__libc_start_main+226>  mov    0x14(%rsp),%edi             │
   │0x7ffff740d766 <__libc_start_main+230>  mov    (%rax),%rdx                 │
   │0x7ffff740d769 <__libc_start_main+233>  callq  *0x18(%rsp)                 │
  >│0x7ffff740d76d <__libc_start_main+237>  mov    %eax,%edi                   │
   │0x7ffff740d76f <__libc_start_main+239>  callq  0x7ffff7427970 <exit>       │
   │0x7ffff740d774 <__libc_start_main+244>  xor    %edx,%edx                   │
   │0x7ffff740d776 <__libc_start_main+246>  jmpq   0x7ffff740d6b9 <__libc_start│
   │0x7ffff740d77b <__libc_start_main+251>  mov    0x39ca2e(%rip),%rax        #│
   │0x7ffff740d782 <__libc_start_main+258>  ror    $0x11,%rax                  │
   │0x7ffff740d786 <__libc_start_main+262>  xor    %fs:0x30,%rax               │
   │0x7ffff740d78f <__libc_start_main+271>  callq  *%rax                       │
   └───────────────────────────────────────────────────────────────────────────┘
multi-thre process 3718 In: __libc_start_main     Line: ??   PC: 0x7ffff740d76d
#3  0x00007ffff7466eb5 in _IO_do_write () from /lib/x86_64-linux-gnu/libc.so.6
#4  0x00007ffff74671ff in _IO_file_overflow ()
   from /lib/x86_64-linux-gnu/libc.so.6
#5  0x0000000000408756 in ?? ()
#6  0x0000000000403980 in ?? ()
#7  0x00007ffff740d76d in __libc_start_main ()
   from /lib/x86_64-linux-gnu/libc.so.6
(gdb)

1
@greatwolf, gdb'nizde tui desteği yok gibi görünüyor. Daha fazla bilgi için bu soruya bakın: stackoverflow.com/q/6706838/72178 .
ks1322

9
Temiz! Şimdi kayıtlar için benzer bir pencerem olabilir mi? Gerçekten de yapabilirim:layout regs
Jens

Diğer TUI komutları için gdb belgelerine de bakın tui reg vector, tamsayı regs yerine vektör reg'larını göstermek gibi . (Her zaman çok kullanışlı değildir, çünkü sadece .v8_int16ya da bir şey seçmenize izin vermez , bu nedenle ekran büyük bir karmaşadır.) ASM hata ayıklama hızlı bir öğreticisi için x86 etiketi wiki'ye bakın .
Peter Cordes

Bu işe yaramaz bir özellik ve çıktı ile ilgilidir. C ++ karışık adları çok uzun ve görüntülemeye çalıştığım her şey sağdaki ekranın dışında. Ne aptalca bir karar (ne zaman ASM'yi varsayılan olarak göstermemeli si) ve ne işe yaramaz bir özellik (gerekli bilgileri göstermeyen görünüm). Bu haberciyi
oylamamanın bir

1
benzer şekilde, ·layout srchata ayıklama sırasında kaynak kodunu görmek ve aynı zamanda bu moddan çıkmak hatırlamak içinCTRL+x+a
Baiyan Huang

149

Yapabilirsin

display/i $pc

ve GDB her durduğunda, bir sonraki talimatın sökülmesini gösterecektir.

GDB-7.0ayrıca bir set disassemble-next-line onsonraki hattın tamamını sökecek ve size daha fazla sökme bağlamı verecek olan destekler .


1
Bu özelliği kullanırken si(ancak değil s) nasıl etkinleştiririz ?
jww

54

Komuta

x/i $pc

her zamanki yapılandırma mekanizması kullanılarak sürekli çalışacak şekilde ayarlanabilir.


29
Ve x/ni $pcgenellikle oldukça yararlı olan bir sonraki n talimatı görmek için.
Stephen Canon

48

Aşağıdaki seçeneği ayarlama:

set  disassemble-next-line on
show disassemble-next-line

Size şöyle görünen sonuçlar verecektir:

(gdb) stepi
0x000002ce in ResetISR () at startup_gcc.c:245
245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
=> 0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
   0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0
(gdb) stepi
0x000002d0  245 {
   0x000002cc <ResetISR+0>: 80 b5   push    {r7, lr}
   0x000002ce <ResetISR+2>: 82 b0   sub sp, #8
=> 0x000002d0 <ResetISR+4>: 00 af   add r7, sp, #0

Bu seçenek yüklememde mevcut görünmüyor. Kaldırıldı mı?
fuz

2
@fuz Büyük olasılıkla,
gdb'niz

@fuz, Ubuntu 18.04'te GDB 8.1'de en azından mevcut.
Ciro Santilli

çok yararlı beceri
DaSqy Stc

1
demontajı göster-sonraki satır test içindir, bayrak durumunu yazdırmak için, açık veya kapalı
Sam

30

Sonraki birkaç talimatın programa adım atarken otomatik olarak görüntülenmesini istiyorsanız, display komutunu aşağıdaki gibi kullanabilirsiniz -

display /3i $pc

Bir kesme noktası vurulduğunda veya programı tek adımda attığınızda, yukarıdaki 3 talimat görüntülenecektir.

Buradaki blog girişinde daha fazla ayrıntı bulabilirsiniz .


23

GDB içinden basın Ctrl x 2ve ekran 3 parçaya bölünecektir.

İlk bölüm size normal kodu üst düzey dilde gösterecektir.

İkincisi size montaj eşdeğeri ve karşılık gelen gösterecektir instruction Pointer.

Üçüncüsü size gdbkomutları girmek için normal istemi sunacaktır .

Ekran görüntüsüne bakın


Başlatamadım Ctrl-X 2, ama gdb -tuimod gibi görünüyor , bu harika.
Ciro Santilli 法轮功 9 病 六四 事件 法轮功

7
Bu aynı zamanda layout splitgdb isteminden de ulaşılabilir .
Şubat'ta chucksmash

22

GDB Gösterge Tablosu

https://github.com/cyrus-and/gdb-dashboard

Bu GDB yapılandırması, GDB nextgibi TUI gibi her durduğunda bize ne istediğimizi göstermek için resmi GDB Python API'sini kullanır .

Ancak, bu uygulamanın yerleşik GDB TUI moduna daha açık ve yapılandırılabilir bir alternatif olduğunu açıkladım: gdb kodlu bölünmüş görünüm

Örneğin, GDB Gösterge Tablosunu sökme, kaynak, kayıtlar ve yığını şu şekilde gösterecek şekilde yapılandırabiliriz:

dashboard -layout source assembly registers stack

Bunun yerine kullanılabilir tüm görünümleri etkinleştirirseniz şöyle görünür:

resim açıklamasını buraya girin

İlgili sorular:


1
@ downvoters: bilgi öğrenebilmem ve geliştirebilmem için lütfen açıkla. Bunun şu anda kabul edilen TUI cevabı için üstün bir alternatif olduğuna inanıyorum: stackoverflow.com/a/2015523/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.