Gdb stdout yerine dosyaya yazdır


104

Gdb çalıştırıyorum ve bu talihsiz tanrı nesnelerinden birini incelemek istiyorum. Her şeyi görmek için pek çok sayfa (ve 24 inçlik bir monitörüm var!) Alıyor. Kullanım kolaylığı için, gdb'nin nesneyi ekran yerine bir dosyaya yazdırmasını istiyorum, böylece onu açabileyim vi ve kolaylıkla hareket edin. gdb'nin tüm çok yönlülüğüne rağmen, bunu yapmanın bir yolu olmalı, değil mi?

Yanıtlar:


151

Günlük kaydını etkinleştirmeniz gerekir.

(gdb) set logging on

Hangi dosyanın kullanılacağını söyleyebilirsiniz.

(gdb) set logging file my_god_object.log

Ve mevcut günlük kaydı yapılandırmasını inceleyebilirsiniz.

(gdb) show logging

15
Çıktının yalnızca günlük dosyasına gitmesini istiyorsanız , kullanın set logging redirect on.
Ben C

5
set logging file my_god_object.logÖnceden ayarlamamız gerekmez set logging onmi?
Herpes Serbest Mühendisi

Bu artı tail -fve awkbugün gerçekten çok yardımcı oldu. Teşekkürler!
2019

13

Çıkışı gdb'den bir dosyaya şu runkomutla yönlendirebileceğinizi buldum :

(gdb) run > outfile

11
Bu, gdb'nin kendisinden değil, hata ayıklanan programın çıktısı olacaktır. OP, gdb'nin kendi çıktısını günlüğe kaydetmek istedi.
paul


@thepaul ama bu aslında çok kullanışlı, çünkü gdb'nin stdinini QDebug çöpüyle çöpe atan bir QT programında hata ayıklama yapıyorum
rostamn739

@ rostamn739 oops, hiç yardımcı olmadı
rostamn739

12

@ Qubodup yanıtını genişletme

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

-exAnahtar bir gdb komutu çalıştırır. Bu yüzden yukarıdakiler çekirdek dosyasını yükler, btkomutu çalıştırır ve ardından quitkomutu çalıştırır . Çıktı backtrace.logekrana ve ayrıca ekrana yazılır .

Diğer bir kullanışlı gdb çağrısı (tüm iş parçacıklarından yerel değişkenlerle yığın izleme sağlar)

gdb core.3599 -ex 'thread apply all bt full' -ex quit

Bazı sistemlerde şunu yazmanız gerekirgdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread tümünü bt full uygula' -ex quit Ekle --batch komut istemi olmadan çalışmak için -eg sudo gdb --batch core.3599 -ex 'thread tümünü uygula bt full' -ex quit> output .log
David Skelly

9

Gönderen https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

Gdb komutlarının çıktısını bir dosyaya kaydetmek isteyebilirsiniz. Gdb'nin günlük kaydını kontrol etmek için birkaç komut vardır.

set logging on

Günlük kaydı etkinleştir.

set logging off

Günlük kaydını devre dışı bırakın.

set logging file file

Mevcut günlük dosyasının adını değiştirin. Varsayılan günlük dosyası gdb.txt'dir.

set logging overwrite [on|off]

Varsayılan olarak, gdb günlük dosyasına eklenir. Oturum açmayı bunun yerine günlük dosyasının üzerine yazacak şekilde ayarlamak istiyorsanız, üzerine yazmayı ayarlayın.

set logging redirect [on|off]

Varsayılan olarak, gdb çıktısı hem terminale hem de günlük dosyasına gidecektir. Çıktının yalnızca günlük dosyasına gitmesini istiyorsanız yeniden yönlendirmeyi ayarlayın.

show logging

Günlük ayarlarının mevcut değerlerini gösterin.



5

Çıktıyı görmeye devam ederken gdb'yi bir dosyaya kaydetmenin basit bir yöntemi (bu, komut yazmayı kolaylaştırır) kullanmaktır tee:

gdb command |& tee gdb.log

1

Burada pek çok iyi yanıt olmasına rağmen, benim için işe yarayan tek şeyi yine de göndermem gerekiyor:

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

Bu, gdb ve ikili çıktıyı aynı log.txt dosyasına almanın ve aynı zamanda konsolda görmenin tek yoluydu .

DÜZENLE:

Dikkat: Çıktı, gdb çıkışı ve ikili çıktı arasında kısmen senkronize değil gibi görünüyor. Biri onaylayabilir mi? Telnet / ssh istemcinizin konsolunuzda gördüğünüz çıktıyı günlüğe kaydetme işlevi olup olmadığını kontrol etmek isteyebilirsiniz.


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.