Bagaimana cara menyoroti dan mewarnai keluaran gdb selama debugging interaktif?

172

Tolong jangan balas saya harus menggunakan ddd, nemiver, emacs, vim, atau front-end lainnya, saya hanya lebih suka gdb, tetapi ingin melihat outputnya dengan beberapa warna terminal.

elmarco
sumber
4
Ini tidak akan memberi Anda warna (jadi saya tidak akan menyebut ini sebagai Jawaban), tetapi beberapa konfigurasi ~ / .gdbinit akan meningkatkan pengalaman. Saya menggunakan ini sebagai minimum: mengatur riwayat simpan pada set cetak cantik set output-radix 16 set tinggi 0
activout.se
Akan menyenangkan untuk mengubah jawaban yang diterima sehingga jawaban saya yang lama dan salah dapat dihapus. Terima kasih.
ddaa
Setelah menyorot baris saat ini ldiimplementasikan sourceware.org/bugzilla/show_bug.cgi?id=21044 , saya hanya akan menambahkan lke hook-stopdan masukkan Dev Nirvana.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

183

.gdbinit

Anda dapat men-tweak Anda ~/.gdbinituntuk memiliki warna. Anda dapat menggunakan mammon .gdbinityang tersedia di sini:

https://github.com/gdbinit/gdbinit

Anda dapat men-tweak sebanyak yang Anda inginkan juga. Saya menemukan ini berkat jawaban SO ini . Berikut jenis output yang dapat Anda peroleh:

.gdbinit

Repositori GitHub juga tersedia: https://github.com/gdbinit/Gdbinit

Di samping catatan, ide yang sama juga diterapkan pada lldb .

Dasbor GDB

Mengikuti konsep yang sama, GDB Dashboard menyediakan antarmuka visual modular untuk GDB dengan Python.

Dasbor GDB

(batal) walker

Proyek serupa lainnya menggunakan dukungan Python GDB untuk memberikan lebih banyak ekstensibilitas, jadi ini patut dicoba: https://github.com/dholm/voidwalker

@dholm juga menyediakan .gdbinit miliknya terinspirasi dari yang sebelumnya.

(batal) walker

pwndbg

Beberapa proyek menyediakan serangkaian fungsi yang berguna, termasuk tampilan yang ditingkatkan. Ini adalah kasus untuk PEDA atau pwndbg . Yang terakhir memberikan deskripsi berikut:

Penggantian PEDA. Dalam semangat teman baik kita windbg, pwndbgdiucapkan pwnd-bag.

  • Mempercepat
  • Kegembiraan
  • Kode bersih

Ini memberikan perintah untuk mendukung debugging dan mengeksploitasi pengembangan yang mirip dengan yang dari PEDA, dan tampilan yang lebih baik (meskipun ini bukan fokus utama proyek). Perangkat lunak ini masih dalam pengembangan, dan belum dirilis dengan benar.

pwndbg

voltron

The proyek deskripsi negara:

Voltron adalah UI debugger yang dapat dikembangkan untuk peretas. Ini memungkinkan Anda untuk melampirkan tampilan utilitas yang berjalan di terminal lain ke debugger Anda (LLDB atau GDB), menampilkan informasi bermanfaat seperti pembongkaran, menumpuk konten, nilai register, dll, sambil tetap memberi Anda CLI debugger yang sama seperti yang biasa Anda gunakan.

Anda dapat memodifikasi Anda .gdbinituntuk secara otomatis mengintegrasikannya. Namun, tampilan itu sendiri berada di luar GDB (misalnya dalam split tmux).

voltron

GEF

GEF adalah pilihan lain, dan digambarkan sebagai:

Ini bertujuan untuk digunakan sebagian besar oleh para eksploit dan insinyur-balik, untuk menyediakan fitur tambahan untuk GDB menggunakan API Python untuk membantu selama proses analisis dinamis dan mengeksploitasi pengembangan.

GEF

BenC
sumber
banyak terima kasih atas jawaban Anda, apakah Anda punya ide cara mematikan register output? (Saya menggunakan gdb untuk kode C ++ dan tidak memerlukan level assembler segera)
vak
Iya. Sialan "Panjang komentar minimal harus 15 karakter."
vak
1
@vak sudah coba set $SHOWCPUREGISTERS = 0? Pada dasarnya Anda memiliki beberapa parameter yang dapat Anda atur , dan Anda selalu dapat memodifikasi kode sesuai dengan kebutuhan Anda.
BenC
100

Ini bukan warna, tetapi pertimbangkan gui teks gdb . Itu membuat perbedaan besar untuk bagaimana gdb dapat digunakan.

Anda dapat meluncurkannya dengan:

gdb -tui executable.out

Tangkapan layar:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, fitur utamanya adalah:

  • menunjukkan garis sumber mana yang kita pakai dan garis sekitarnya
  • menunjukkan breakpoints
John Carter
sumber
5
Wow! Terima kasih! Saya sudah lama mencari shell grafis yang bagus di sekitar gdb, dan saya sudah mencoba xxgdb, kgdb, dan ddd, tapi tidak ada yang bekerja dengan baik untuk saya, jadi saya terjebak dengan antarmuka baris perintah yang lama. Tapi ini benar-benar sempurna!
Thomas Padron-McCarthy
46
Ctrl-x Ctrl-a: Masukkan ini untuk beralih ke dan dari mode teks gui, bekerja bahkan tanpa opsi baris perintah.
jturcotte
2
Mencetak ke stdout dari program merusak antarmuka untuk saya. Adakah solusi selain mengarahkannya?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Saya mendapatkan masalah yang sama dengan stdout merusak antarmuka. Ctrl-L atau apa pun redraw mengikat Anda membuatnya setidaknya dapat digunakan. Untuk orang-orang dengan mode edit vi diaktifkan, Ctrl-X Ctrl-A tidak berfungsi, tetapi perintah 'layout src' akan menempatkan Anda dalam mode TUI dengan sumber yang ditampilkan seperti gambar.
wilywampa
1
Buka terminal kedua dan kemudian jalankan perintah: $ tty Gunakan hasilnya untuk mengarahkan stdout dari sesi gdb ke terminal itu menggunakan (gdb) atur perintah inferior-tty. ex. dari .gdbinit saya atur inferior-tty / dev / tty2 sekarang stdout Anda tidak akan mengacaukan $ gdb -tui.
netskink
46

Saya tahu Anda tidak ingin frontend. Tetapi bagaimana dengan cgdb sangat dekat dengan gdb, itu adalah textmode tetapi memiliki jendela sumber di atas dengan highlight sintaks pada kode.

Johan
sumber
2
sudo apt-get install cgdb
cs01
2
Kesungguhan yang nyata :)
Abaikan
Hanya mencoba menjalankannya: ia tidak melihat riwayat gdb, dan ia juga memiliki prompt kacau, di mana ada beberapa spasi putih antara tanda sisipan dan tempat aktual di mana simbol diketik (ini kemungkinan karena saya memiliki prompt berwarna di gdb ) . Tidak terkesan sama sekali.
Hi-Angel
19

Dimungkinkan untuk sangat meningkatkan tampilan gdb melalui penggunaan warna. Ini dilakukan melalui salah satu metode berikut:

  1. Prompt berwarna melalui "set prompt". Misalnya, buat perintah tebal dan merah:

    set prompt \033[1;31m(gdb) \033[m

    atau buat prompt bentuk baru, tebal dan merah:

    set prompt \033[01;31m\n\n#####################################> \033[0m

    masukkan deskripsi gambar di sini

  2. Perintah berwarna melalui kait

  3. Penyorotan sintaksis berwarna dari perintah "daftar".

Semua contoh tersedia di posting blog berikut yang ditulis oleh Michael Kelleher:

"Beautify GDB", 12 Mei 2010 (via archive.org)

"Penyorotan sintaksis GDB Eksperimental", 15 Mei 2010 (via archive.org)

Mike
sumber
14
Tautan rusak.
John Carter
7
@ Mike: akan bermanfaat untuk memposting konten tautan tersebut di sini karena situs tidak lagi dapat diakses dan robots.txt mencegah archive.org mengindeksnya.
Lucian Adrian Grijincu
1
Anda dapat memperoleh informasi yang relevan di sini: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil
1
Tautan tersebut sekarang menunjuk ke cache archive.org dari posting blog.
Alex Quinn
1
@ Mike, tampaknya Anda adalah pembuat posting blog; jika demikian, Anda harus mengungkapkannya dalam jawaban.
David Z
13

Baru di GDB 8.3 mendatang !

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

Gaya terminal sekarang tersedia untuk CLI dan TUI. Sorotan Sumber GNU juga dapat digunakan untuk memberikan gaya potongan kode sumber. Lihat perintah "set style", di bawah, untuk informasi lebih lanjut.

tangkapan layar gdb 8.2.91.20190401-23.fc30

elmarco
sumber
Jawaban terbaik yang pernah ada! Anda dapat menemukan di sini tutorial tentang cara menginstal gdb 8.3 medium.com/@simonconnah/… , perhatikan mesin Anda membutuhkan setidaknya 512MB RAM, jika tidak, gcckompiler akan mulai membuang.
pengguna
7
#into .gdbinit
shell mkfifo /tmp/colorPipe

define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-disassemble
hookpost-list
end 

define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end 

define hookpost-list
set logging off 
set logging redirect off 
shell sleep 0.1s
end 

define hook-quit
shell rm /tmp/colorPipe
end 

define re
hookpost-disassemble
echo \033[0m
end 
document re
Restore colorscheme
end 

Peringatan: Buggy. Tidak ada dukungan TUI, hack 'mode pengguna'.

Menemukan bagian utama di sini dan memodifikasinya sedikit. Perlu sorotan, c ++ filt. Jika warna menjadi kacau masalah ulang perintah.

ftk
sumber
7

cgdb jauh lebih baik daripada gdb -tui

justin.yqyang
sumber
Sepakat. Garis-garis sederhana yang dicetak oleh program saya menghancurkan konsol gdb -tui. Ini tidak terjadi di bawah cgdb. Terima kasih atas tipnya!
Randall Cook
4

Saya ingin menyoroti sebagai berikut: menekankan garis-garis jejak tumpukan yang milik file sumber saya (bukan perpustakaan).

Solusinya adalah menggunakan gdb-python (di MSYS; di Linux biasanya sudah gdbdilengkapi dengan Python built-in?), Hook backtrace, gunakan

python stack_trace = gdb.execute('backtrace', False, True')

Kemudian proses stack_tracedengan regex Python, dan cetaklah. Warna-warna berani dan lainnya diperoleh dengan fungsi seperti ini:

def term_style(*v):
    """1 is bold, 30--37 are the 8 colours, but specifying bold may also
    change the colour. 40--47 are background colours."""
    return '\x1B['+';'.join(map(str, v))+'m'

#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)
Evgeni Sergeev
sumber
Contoh kerja yang menggunakan kait - bahkan jika minim - mungkin akan lebih diterima.
Hi-Angel
4

Kombinasi warna lain yang baik diberikan oleh konfigurasi ini . Itu membuat memeriksa backtraces jauh lebih mudah. Untuk menggunakannya, cukup simpan file itu ~/.gdbinitdan jalankan gdb secara normal

Andrea Araldo
sumber
Terima kasih, inilah tepatnya yang saya cari. Saya melihat ke dalam aplikasi multi-threaded dengan panggilan panjang dan ini sangat cocok untuk backtraces tersebut.
Johan Bjäreholt
-2

Anda bisa mendapatkan warna apa pun yang Anda inginkan;

# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal
RandomNickName42
sumber