Gdb drukuje do pliku zamiast na standardowe wyjście

104

Uruchamiam gdb i chcę zbadać jeden z tych niefortunnych obiektów bogów. Potrzeba wielu stron (a mam monitor 24 "obrócony na bok!), Aby zobaczyć całość. Dla ułatwienia chciałbym, aby gdb wydrukowało obiekt do pliku zamiast na ekranie, abym mógł go otworzyć w vi i poruszaj się z łatwością. Przy całej wszechstronności gdb musi istnieć sposób, aby to zrobić, prawda?

metafora pytoniczna
źródło

Odpowiedzi:

151

Musisz włączyć logowanie.

(gdb) set logging on

Możesz powiedzieć, którego pliku użyć.

(gdb) set logging file my_god_object.log

Możesz sprawdzić aktualną konfigurację logowania.

(gdb) show logging
Tadeusz A. Kadłubowski
źródło
15
A jeśli chcesz, aby dane wyjściowe trafiały tylko do pliku dziennika, użyj set logging redirect on.
Ben C,
5
Czy nie powinniśmy ustawić set logging file my_god_object.logwcześniej set logging on?
Herpes Free Engineer
To plus tail -fi awkbył dzisiaj bardzo pomocny. Dzięki!
remikes
12

Odkryłem, że możesz przekierować dane wyjściowe z gdb do pliku za pomocą runpolecenia:

(gdb) run > outfile
Lucas Gabriel Sánchez
źródło
11
Byłby to wynik debugowanego programu, a nie sam plik gdb. OP chciał logować własne wyjście gdb.
Paweł
zobacz także: stackoverflow.com/questions/2388561/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@thepaul, ale jest to w rzeczywistości bardzo przydatne, ponieważ debuguję program QT, który po prostu kasuje stdin gdb za pomocą śmieci
QDebug
@ rostamn739 oops, w ogóle nie pomogło
rostamn739
12

Rozszerzanie odpowiedzi @ qubodup

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

-exprzełącznik uruchamia komendę gdb. Więc powyższe ładuje plik core, uruchamia btpolecenie, a następnie quitpolecenie. Dane wyjściowe są zapisywane backtrace.logna ekranie, a także na ekranie.

Innym użytecznym wywołaniem gdb (dającym śledzenie stosu ze zmiennymi lokalnymi ze wszystkich wątków) jest

gdb core.3599 -ex 'thread apply all bt full' -ex quit
user7610
źródło
W niektórych systemach należy wpisaćgdb -c core.3599 ...
user7610
1
> gdb core. 3599 -ex 'wątek zastosuj wszystkie bt full' -ex quit Dodaj --batch, aby uruchomić bez zachęty -eg sudo gdb --batch core. 3599 -ex 'wątek zastosuj wszystkie bt full' -ex quit> output .log
David Skelly,
9

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

Możesz chcieć zapisać dane wyjściowe poleceń gdb do pliku. Istnieje kilka poleceń sterujących rejestrowaniem GDB.

set logging on

Włącz logowanie.

set logging off

Wyłącz logowanie.

set logging file file

Zmień nazwę bieżącego pliku dziennika. Domyślny plik dziennika to gdb.txt.

set logging overwrite [on|off]

Domyślnie gdb dołączy do pliku dziennika. Ustaw nadpisywanie, jeśli chcesz ustawić logowanie, aby zamiast tego nadpisywać plik dziennika.

set logging redirect [on|off]

Domyślnie dane wyjściowe gdb trafiają zarówno do terminala, jak i do pliku dziennika. Ustaw przekierowanie, jeśli chcesz, aby dane wyjściowe trafiały tylko do pliku dziennika.

show logging

Pokaż aktualne wartości ustawień rejestrowania.

husin alhaj ahmade
źródło
2
Skopiuj wklej sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html bez cytowania.
Herpes Free Engineer
5

Prostą metodą logowania gdb do pliku przy jednoczesnym wyświetlaniu danych wyjściowych (co ułatwia pisanie poleceń) jest użycie tee:

gdb command |& tee gdb.log
qubodup
źródło
1

Chociaż jest tu wiele dobrych odpowiedzi, nadal muszę opublikować jedyną rzecz, która zadziałała:

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

To był jedyny sposób na pobranie gdb i binarnych danych wyjściowych do tego samego pliku log.txt, jednocześnie wyświetlając go na konsoli.

EDYTOWAĆ:

Przestroga: Wydaje się, że dane wyjściowe nie są częściowo zsynchronizowane między wyjściem gdb a wyjściem binarnym. Czy ktoś może potwierdzić? Możesz chcieć sprawdzić, czy twój klient telnet / ssh ma funkcję rejestrowania danych wyjściowych, które widzisz w konsoli.

Niko
źródło