Gdb-Druck in Datei statt Standardausgabe

104

Ich leite gdb und möchte eines dieser unglücklichen Gottobjekte untersuchen. Es dauert viele Seiten (und ich habe einen 24-Zoll-Monitor zur Seite gedreht!), Um das Ganze zu sehen. Zur Vereinfachung möchte ich, dass gdb das Objekt in eine Datei anstelle des Bildschirms druckt, damit ich es öffnen kann vi und bewege dich mühelos. Bei aller Vielseitigkeit von gdb muss es einen Weg geben, dies zu tun, oder?

pythonische Metapher
quelle

Antworten:

151

Sie müssen die Protokollierung aktivieren.

(gdb) set logging on

Sie können angeben, welche Datei verwendet werden soll.

(gdb) set logging file my_god_object.log

Außerdem können Sie die aktuelle Protokollierungskonfiguration überprüfen.

(gdb) show logging
Tadeusz A. Kadłubowski
quelle
15
Wenn Sie möchten, dass die Ausgabe nur in die Protokolldatei verschoben wird, verwenden Sie set logging redirect on.
Ben C
5
Sollten wir nicht set logging file my_god_object.logvorher setzen set logging on?
Herpes Free Engineer
Dieses Plus tail -fund awkwar heute wirklich hilfreich. Vielen Dank!
Remcycles
12

Ich habe festgestellt, dass Sie die Ausgabe von gdb über den folgenden runBefehl in eine Datei umleiten können :

(gdb) run > outfile
Lucas Gabriel Sánchez
quelle
11
Dies wäre die Ausgabe des zu debuggenden Programms, nicht die Ausgabe von gdb selbst. OP wollte die eigene Ausgabe von gdb protokollieren.
der Paul
siehe auch: stackoverflow.com/questions/2388561/…
Ciro Santilli 法轮功 冠状 病 六四 事件 17
@thepaul, aber das ist in der Tat sehr nützlich, da ich ein QT-Programm debugge, das nur GDBs Standard mit seinem QDebug-Müll zerstört
rostamn739
@ rostamn739 oops, hat überhaupt nicht geholfen
rostamn739
12

Erweiterung der Antwort von @ qubodup

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

Der -exSwitch führt einen GDB-Befehl aus. Das obige lädt also die Kerndatei, führt den btBefehl und dann den quitBefehl aus. Die Ausgabe wird auf backtrace.logund auch auf dem Bildschirm geschrieben.

Ein weiterer nützlicher GDB-Aufruf (Stacktrace mit lokalen Variablen aus allen Threads) ist

gdb core.3599 -ex 'thread apply all bt full' -ex quit
user7610
quelle
Auf einigen Systemen müssen Siegdb -c core.3599 ...
user7610
1
> gdb core.3599 -ex 'thread alle bt full' -ex beenden Addiere --batch, um ohne Eingabeaufforderung ausgeführt zu werden -eg sudo gdb --batch core.3599 -ex 'thread wende alle bt full' -ex quit> aus .log
David Skelly
9

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

Möglicherweise möchten Sie die Ausgabe von GDB-Befehlen in einer Datei speichern. Es gibt verschiedene Befehle zur Steuerung der Protokollierung von gdb.

set logging on

Aktiviere das Logging.

set logging off

Deaktivieren Sie die Protokollierung.

set logging file file

Ändern Sie den Namen der aktuellen Protokolldatei. Die Standardprotokolldatei ist gdb.txt.

set logging overwrite [on|off]

Standardmäßig wird gdb an die Protokolldatei angehängt. Setzen Sie das Überschreiben, wenn Sie festlegen möchten, dass die Anmeldung stattdessen die Protokolldatei überschreibt.

set logging redirect [on|off]

Standardmäßig wird die GDB-Ausgabe sowohl an das Terminal als auch an die Protokolldatei gesendet. Stellen Sie die Umleitung ein, wenn die Ausgabe nur in die Protokolldatei verschoben werden soll.

show logging

Zeigen Sie die aktuellen Werte der Protokollierungseinstellungen an.

husin alhaj ahmade
quelle
2
Kopieren Sie die Paste von sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html ohne Angabe von Gründen .
Herpes Free Engineer
5

Eine einfache Methode zum Protokollieren von GDB in einer Datei, während die Ausgabe weiterhin angezeigt wird (was das Schreiben von Befehlen erleichtert), ist folgende tee:

gdb command |& tee gdb.log
qubodup
quelle
1

Obwohl es hier viele gute Antworten gibt, muss ich noch das einzige posten, was für mich funktioniert hat:

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

Dies war die einzige Möglichkeit, GDB- und Binärausgaben in dieselbe log.txt-Datei zu übertragen und sie gleichzeitig auf der Konsole anzuzeigen.

BEARBEITEN:

Achtung: Die Ausgabe scheint teilweise nicht zwischen der GDB-Ausgabe und der Binärausgabe synchronisiert zu sein. Kann jemand bestätigen? Möglicherweise möchten Sie überprüfen, ob Ihr Telnet / SSH-Client über eine Funktion zum Protokollieren der Ausgabe verfügt, die Sie in Ihrer Konsole sehen.

Niko
quelle
1

Sie haben hier mehrere Antworten erhalten. Sie sind richtig. Ich möchte nur einen Befehl hinzufügen, mit dem Sie alle Ausgaben auf einmal erfassen können. Dies ist sehr hilfreich, wenn Sie eine große Rückverfolgung sammeln. Gehen Sie folgendermaßen vor, bevor Sie eine Protokollierungskonfiguration vornehmen:

(gdb)set height 0

Ich habe es in diesem Artikel gefunden: https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226351332

Lexdo
quelle