Tampilkan instruksi perakitan saat ini di GDB


179

Saya sedang melakukan debugging tingkat perakitan di GDB. Apakah ada cara untuk mendapatkan GDB untuk menunjukkan kepada saya instruksi perakitan saat ini dengan cara yang sama yang menunjukkan baris sumber saat ini? Output default setelah setiap perintah terlihat seperti ini:

0x0001433f      990         Foo::bar(p);

Ini memberi saya alamat instruksi saat ini, tetapi saya harus tetap merujuk kembali ke output disassembleuntuk melihat instruksi yang sedang saya jalankan.


Jawaban:


314

Anda dapat beralih ke tata letak perakitan di GDB:

(gdb) layout asm

Lihat di sini untuk informasi lebih lanjut. Instruksi perakitan saat ini akan ditampilkan di jendela assembler.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │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, sepertinya Anda tidak memiliki dukungan di gdb. Lihat pertanyaan ini untuk informasi lebih lanjut: stackoverflow.com/q/6706838/72178 .
ks1322

9
Rapi! Sekarang bisakah saya memiliki jendela serupa untuk register? Memang saya bisa:layout regs
Jens

Lihat juga gdb docs untuk perintah TUI lainnya , ingin tui reg vectormenunjukkan regs vektor, bukan regs integer. (Namun, tidak selalu dapat digunakan, karena tidak memungkinkan Anda memilih hanya .v8_int16atau sesuatu, sehingga tampilannya berantakan.) Lihat wiki tag x86 untuk tutorial cepat untuk debugging asm.
Peter Cordes

Itu tentang fitur dan output yang tidak berguna. Nama C ++ yang rusak terlalu panjang, dan semua yang saya coba lihat adalah dari layar di sebelah kanan. Keputusan yang bodoh (tidak menampilkan ASM secara default kapan si), dan fitur apa yang tidak berguna (viewport yang tidak menampilkan informasi yang diperlukan). Tidak masuk akal memilih jawaban ini karena Anda hanya pembawa pesan ...
jww

1
sama halnya, ·layout srcuntuk melihat kode sumber saat debugging, dan juga patut diingat untuk keluar dari mode ini olehCTRL+x+a
Baiyan Huang

149

Anda dapat melakukan

display/i $pc

dan setiap kali GDB berhenti, itu akan menampilkan pembongkaran instruksi berikutnya.

GDB-7.0juga mendukung set disassemble-next-line on, yang akan membongkar seluruh baris berikutnya, dan memberi Anda lebih banyak konteks pembongkaran.


1
Bagaimana cara kami mengaktifkan fitur ini saat menggunakan si(tetapi tidak s)?
jww

54

Perintah

x/i $pc

dapat diatur untuk berjalan sepanjang waktu menggunakan mekanisme konfigurasi yang biasa.


29
Dan x/ni $pcuntuk melihat n instruksi selanjutnya, yang seringkali cukup bermanfaat.
Stephen Canon

48

Mengatur opsi berikut:

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

Akan memberi Anda hasil yang terlihat seperti ini:

(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

Pilihan ini sepertinya tidak ada di instalasi saya. Apakah sudah dihapus?
fuz

2
@ fuz Kemungkinan besar, gdb Anda sudah tua
tbodt

@ fuz hadir setidaknya di GDB 8.1 di Ubuntu 18.04.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

keterampilan yang sangat berguna
DaSqy Stc

1
show disassemble-next-line adalah untuk tes, untuk mencetak status bendera, aktif atau tidak
Sam

30

Jika Anda ingin beberapa instruksi berikutnya ditampilkan secara otomatis saat melangkah melalui program ini, Anda dapat menggunakan perintah tampilan sebagai berikut -

display /3i $pc

Di atas akan menampilkan 3 instruksi setiap kali breakpoint terkena atau ketika Anda satu langkah program.

Lebih detail di entri blog di sini .


23

Dari dalam gdb, tekan Ctrl x 2dan layar akan terbagi menjadi 3 bagian.

Bagian pertama akan menunjukkan kepada Anda kode normal dalam bahasa tingkat tinggi.

Kedua akan menunjukkan padanan yang setara dan sesuai instruction Pointer.

Ketiga akan memberi Anda gdbprompt normal untuk memasukkan perintah.

Lihat tangkapan layar


Saya tidak bisa menjalankannya dengan Ctrl-X 2, tetapi sepertinya gdb -tuimode, yang sangat bagus.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

7
Ini juga dapat dijangkau dengan layout splitdari gdb prompt.
chucksmash

22

Dasbor GDB

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

Konfigurasi GDB ini menggunakan API GDB Python resmi untuk menunjukkan kepada kita apa pun yang kita inginkan setiap kali GDB berhenti setelah misalnya next, seperti TUI.

Namun saya telah menemukan bahwa implementasi ini adalah alternatif yang lebih kuat dan dapat dikonfigurasi untuk mode TUI GDB built-in seperti yang dijelaskan di: gdb split view dengan kode

Misalnya, kita bisa mengonfigurasi Dasbor GDB untuk menampilkan pembongkaran, sumber, register, dan tumpukan dengan:

dashboard -layout source assembly registers stack

Inilah yang terlihat jika Anda mengaktifkan semua tampilan yang tersedia sebagai gantinya:

masukkan deskripsi gambar di sini

Pertanyaan-pertanyaan Terkait:


1
@ downvoters: tolong jelaskan agar saya dapat mempelajari dan meningkatkan info. Saya percaya bahwa ini adalah alternatif yang unggul untuk TUI diterima saat ini jawabannya: stackoverflow.com/a/2015523/895245
Ciro Santilli郝海东冠状病六四事件法轮功
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.