Perintah yang paling rumit / berguna untuk debugger gdb [ditutup]

138

Dapatkah Anda memposting perintah yang paling sulit dan berguna saat Anda menjalankan debugger seperti gdb atau dbx.

Vijay
sumber
Saya menemukan dokumentasi ini bagus. scc.ustc.edu.cn/zlsc/sugon/intel/debugger/cl/…
Rick

Jawaban:

134
  1. backtrace full : Lengkap backtrace dengan variabel lokal
  2. atas , bawah , bingkai : Bergerak melintasi bingkai
  3. tonton : Menunda proses ketika suatu kondisi tertentu terpenuhi
  4. set print pretty on : Mencetak kode sumber C yang diformat dengan cantik
  5. aktifkan logging on : Log sesi debugging untuk menunjukkan kepada orang lain untuk dukungan
  6. atur print array on : Pencetakan array cantik
  7. selesai : Lanjutkan sampai akhir fungsi
  8. aktifkan dan nonaktifkan : Aktifkan / nonaktifkan breakpoints
  9. tbreak : Hancurkan satu kali, dan kemudian hilangkan breakpoint
  10. dimana : Nomor baris sedang dieksekusi
  11. info lokal : Lihat semua variabel lokal
  12. info args : Lihat semua argumen fungsi
  13. daftar : lihat sumber
  14. rbreak : break on function mencocokkan ekspresi reguler
Ramkumar Ramachandra
sumber
7
info locals- Lihat semua variabel lokal; daftar - lihat sumber; rbreak - break on function mencocokkan ekspresi reguler.
Paul Biggar
source / path / to / macro / file Dan semua makro bagus saya ada untuk membantu saya men-debug dalam hitungan detik.
Sudhanshu
1
set print object onuntuk elemen polimorfik dan set print elements 0dua perintah yang saya gunakan sangat sering. Cukup bermanfaat.
Kiril Kirov
1
Juga, t a a bt(artinya thread apply all backtrace). Dapat digunakan dengan (hampir) semua perintah lainnya. Sangat berguna dengan bt full.
Kiril Kirov
101

Mulai gdb dengan antarmuka pengguna tekstual

gdb -tui
Amro
sumber
21
Saya tidak percaya fitur ini lolos dari saya selama bertahun-tahun. Terima kasih terima kasih terima kasih!
DevSolar
Terima kasih, Anda telah menghemat banyak waktu saya .. Luar Biasa ....
sujin
1
Dan yang lainnya: <minus> RET
SullX
1
atau gunakan cgdb
Patryk
fitur yang sangat bagus. Ketinggalan sejauh ini ...
PraveenMax
45

Mulai di gdb 7.0, ada debugging reversibel , jadi perintah favorit baru Anda adalah:

* reverse-continue ('rc') -- Continue program being debugged but run it in reverse
* reverse-finish -- Execute backward until just before the selected stack frame is called
* reverse-next ('rn') -- Step program backward, proceeding through subroutine calls.
* reverse-nexti ('rni') -- Step backward one instruction, but proceed through called subroutines.
* reverse-step ('rs') -- Step program backward until it reaches the beginning of a previous source line
* reverse-stepi -- Step backward exactly one instruction
* set exec-direction (forward/reverse) -- Set direction of execution.
Paul Biggar
sumber
21

Alih-alih meluncurkan GDB dengan param "-tui" Anda juga dapat beralih ke mode teks setelah beberapa saat menggunakan dengan mengetikkan "wh".

martin
sumber
3
Ctrl-a untuk beralih kembali ke tampilan baris perintah 'normal'!
Kevin
2
"- 'dapat digunakan instaed' wh '. lebih pendek lebih baik .. :)
raj_gt1
6
Ctrl-a a? Apakah ini lelucon? Terlihat lebih seperti tmux/ screenperintah. Dan tidak bekerja untuk saya. Ini harus menjadi salah satu sebagai per docs : C-x C-a, C-x a, C-x A.
x-yuri
Sebenarnya C-x a. Anda juga dapat beralih tampilan dengan C-x 1dan C-x 2ketika dalam mode tui untuk melihat perakitan juga (jika perlu).
Sam Whitlock
16

thread apply all btatau thread apply all print $pc: Untuk mengetahui dengan cepat apa yang dilakukan semua utas.

Olof
sumber
Itu adalah perintah yang saya cari sejak lama! Benar-benar tidak enak untuk memeriksa semua 30 utas satu per satu!
tothphu
6

Misalnya makro yang didefinisikan dalam stl-views.gdb

menyeramkan
sumber
6

Menggunakan -command=<file with gdb commands>opsi saat menjalankan gdb. Sama seperti -x <command file>. File perintah ini dapat berisi perintah-perintah gdb seperti breakpoints, opsi, dll. Berguna seandainya sebuah executable tertentu perlu dimasukkan melalui proses debug berturut-turut menggunakan gdb.

raghava
sumber
Anda juga dapat menggunakan -iexopsi untuk menambahkan perintah individual pada baris perintah gdb.
doug65536
5

scripting gdb adalah trik yang bagus, selain itu saya suka mengatur penjadwalan mengunci on / off untuk mencegah jalannya utas lainnya ketika Anda melangkah masuk.

Ben
sumber
1
Bagaimana Anda mengatur penguncian scheduler?
deft_code
3
set scheduler-locking oninside gdb
Ben
bagaimana Anda menjadikan ini default? Saya mencobanya .gdbinit tetapi gdb mencetak /home/omry/.gdbinit:1: Kesalahan dalam file perintah bersumber: Target 'Tidak ada' tidak dapat mendukung perintah ini.
Omry Yadan
4
  • Menggunakan .gdbinit (memulai file di mana Anda dapat menulis makro dan menelepon dari gdb). Tempatkan .gdbinit di direktori home Anda sehingga diambil setiap kali gdb dimuat
  • utas info untuk mendaftar semua utas aktif, dan f (#) -> # nomor utas yang ingin Anda alihkan

  • kadang saya menggunakan gdb untuk mengkonversi dari hex ke desimal atau biner, itu sangat berguna daripada membuka kalkulator

    • p / d 0x10 -> memberikan setara desimal 0x10
    • p / t 0x10 -> biner setara dengan 0x10
    • p / x 256 -> hex setara dengan 256
subbul
sumber
4

Alih-alih memulai gdb dengan opsi -tui untuk melihat proses anak yang berisi layar yang menyoroti di mana garis pelaksana kode dalam program Anda, masuk dan keluar dari fitur ini dengan Cx o dan Cx a. Ini berguna jika Anda menggunakan fitur dan apa yang sementara tidak digunakan sehingga Anda dapat menggunakan panah atas untuk mendapatkan perintah sebelumnya.

Rose Perrone
sumber
2
Anda dapat mengubah fokus ke jendela perintah menggunakan focus cmdsehingga panah atas / bawah berfungsi. Anda kembali menggunakan focus src.
Nathan Fellman
3

Ini bisa berguna, saya yakin itu bisa diperbaiki, tolong bantu:

define mallocinfo
  set $__f = fopen("/dev/tty", "w")
  call malloc_info(0, $__f)
  call fclose($__f)
elmarco
sumber