Cetak Gdb ke file, bukan stdout

104

Saya menjalankan gdb dan ingin memeriksa salah satu objek tuhan yang malang. Dibutuhkan banyak halaman (dan saya memiliki monitor 24 "yang diputar ke samping!) Untuk melihat semuanya. Untuk kemudahan penggunaan, saya ingin gdb mencetak objek ke file alih-alih layar sehingga saya dapat membukanya di vi dan bergerak dengan mudah. ​​Dengan semua fleksibilitas GDB, pasti ada cara untuk melakukan ini, bukan?

metafora pythonic
sumber

Jawaban:

151

Anda perlu mengaktifkan logging.

(gdb) set logging on

Anda dapat memberi tahu file mana yang akan digunakan.

(gdb) set logging file my_god_object.log

Dan Anda dapat memeriksa konfigurasi logging saat ini.

(gdb) show logging
Tadeusz A. Kadłubowski
sumber
15
Dan jika Anda ingin output hanya masuk ke file log, gunakan set logging redirect on.
Ben C
5
Bukankah kita harus mengatur set logging file my_god_object.logsebelumnya set logging on?
Insinyur Bebas Herpes
Ini plus tail -fdan awksangat membantu hari ini. Terima kasih!
remcycles
12

Saya telah menemukan bahwa Anda dapat mengarahkan output dari gdb ke file melalui runperintah:

(gdb) run > outfile
Lucas Gabriel Sánchez
sumber
11
Itu akan menjadi keluaran dari program yang sedang di-debug, bukan keluaran dari gdb itu sendiri. OP ingin mencatat keluaran gdb sendiri.
paul
lihat juga: stackoverflow.com/questions/2388561/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@thepaul tetapi ini sebenarnya sangat berguna karena saya sedang men-debug program QT yang hanya membuang stdin gdb dengan sampah
QDebug itu
@ rostamn739 oops, tidak membantu sama sekali
rostamn739
12

Memperluas jawaban @ qubodup

gdb core.3599 -ex bt -ex quit |& tee backtrace.log

yang -exberalih menjalankan perintah gdb. Jadi di atas memuat file inti, menjalankan btperintah, lalu quitperintah. Output ditulis ke backtrace.logdan juga di layar.

Pemanggilan gdb berguna lainnya (memberikan stacktrace dengan variabel lokal dari semua utas) adalah

gdb core.3599 -ex 'thread apply all bt full' -ex quit
pengguna7610
sumber
Pada beberapa sistem, Anda perlu mengetikgdb -c core.3599 ...
user7610
1
> gdb core.3599 -ex 'thread apply all bt full' -ex exit Add --batch to run without a prompt -eg sudo gdb --batch core.3599 -ex 'thread apply all bt full' -ex exit> output .log
David Skelly
9

Dari https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

Anda mungkin ingin menyimpan keluaran perintah gdb ke sebuah file. Ada beberapa perintah untuk mengontrol logging gdb.

set logging on

Aktifkan logging.

set logging off

Nonaktifkan logging.

set logging file file

Ubah nama file log saat ini. File log default adalah gdb.txt.

set logging overwrite [on|off]

Secara default, gdb akan menambahkan logfile. Setel timpa jika Anda ingin menyetel masuk untuk menimpa file log sebagai gantinya.

set logging redirect [on|off]

Secara default, keluaran gdb akan menuju ke terminal dan file log. Setel pengalihan jika Anda ingin keluaran hanya pergi ke file log.

show logging

Tunjukkan nilai saat ini dari pengaturan logging.

husin alhaj ahmade
sumber
2
Salin tempel dari sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html tanpa kutipan.
Insinyur Bebas Herpes
5

Metode sederhana untuk mencatat gdb ke file sambil tetap melihat hasilnya (yang memudahkan penulisan perintah) adalah dengan menggunakan tee:

gdb command |& tee gdb.log
qubodup
sumber
1

Meskipun ada banyak jawaban bagus di sini, saya masih harus memposting satu-satunya hal yang berhasil untuk saya:

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt

Ini adalah satu-satunya cara untuk mendapatkan gdb dan keluaran biner ke dalam file log.txt yang sama, sekaligus melihatnya di konsol.

EDIT:

Perhatian: Keluaran tampaknya sebagian tidak disinkronkan antara keluaran gdb dan keluaran biner. Bisakah seseorang mengkonfirmasi? Anda mungkin ingin memeriksa apakah klien telnet / ssh Anda memiliki fungsi untuk mencatat keluaran yang Anda lihat di konsol Anda.

Niko
sumber