GDBが標準出力の代わりにファイルに出力する


104

私はgdbを実行していて、これらの不幸な神オブジェクトの1つを調べたいと考えています。全体を見るには多くのページが必要です(そして24インチのモニターを横向きにしています!)使いやすさのために、オブジェクトを画面ではなくファイルに出力して、オブジェクトを開くことができます。 viを使って簡単に移動できます。gdbのすべての汎用性には、これを行う方法があるはずです。

回答:


151

ロギングを有効にする必要があります。

(gdb) set logging on

使用するファイルを指定できます。

(gdb) set logging file my_god_object.log

また、現在のロギング構成を調べることができます。

(gdb) show logging

15
また、出力をログファイルのみに出力する場合は、を使用しますset logging redirect on
ベンC

5
set logging file my_god_object.log前に設定すべきではないset logging onですか?
ヘルペスフリーエンジニア、

これに加えてtail -fawk今日は本当に役に立ちました。ありがとう!
15:49にリサイクル

12

次のrunコマンドを使用して、gdbからファイルに出力をリダイレクトできることがわかりました。

(gdb) run > outfile

11
これは、デバッグ中のプログラムからの出力であり、gdb自体からの出力ではありません。OPはgdb自身の出力をログに記録したかった。
ポール


@thepaulしかし、gdbのstdinをQDebugガベージで破棄するだけのQTプログラムをデバッグしているので、これは実際には非常に便利です
rostamn739

@ rostamn739おっと、まったく役に立たなかった
rostamn739

12

@qubodupの答えを拡張する

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

-exスイッチは、GDBのコマンドを実行します。したがって、上記はコアファイルをロードし、btコマンドを実行してからコマンドを実行しますquit。出力はbacktrace.log画面にも書き込まれます。

別の便利なgdb呼び出し(すべてのスレッドからのローカル変数でスタックトレースを与える)は

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

一部のシステムでは、次のように入力する必要がありますgdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread apply all bt full' -ex quit Add --batchをプロンプトなしで実行するには-eg sudo gdb --batch core.3599 -ex 'thread apply all bt full' -ex quit> output .log
David Skelly

9

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

gdbコマンドの出力をファイルに保存したい場合があります。gdbのロギングを制御するコマンドはいくつかあります。

set logging on

ロギングを有効にします。

set logging off

ロギングを無効にします。

set logging file file

現在のログファイルの名前を変更します。デフォルトのログファイルはgdb.txtです。

set logging overwrite [on|off]

デフォルトでは、gdbはログファイルに追加します。代わりにログオンを設定してログファイルを上書きする場合は、上書きを設定します。

set logging redirect [on|off]

デフォルトでは、gdb出力は端末とログファイルの両方に送られます。出力をログファイルのみに送信する場合は、リダイレクトを設定します。

show logging

ロギング設定の現在の値を表示します。



5

出力を見ながら(コマンドを書くのを容易にする)gdbをファイルに記録する簡単な方法は以下を使用することteeです:

gdb command |& tee gdb.log

1

ここには多くの良い答えがありますが、私のために働いた唯一のものを投稿する必要があります:

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

これは、gdb バイナリの出力を同じlog.txtファイルに入れる唯一の方法であり、コンソールでも確認できます。

編集:

注意: gdb出力とバイナリ出力の間で、出力が部分的に同期されていないようです。誰かが確認できますか?telnet / sshクライアントに、コンソールに表示される出力をログに記録する機能があるかどうかを確認することをお勧めします。


1

ここで複数の回答がありました。彼らは正しいです。すべての出力を一度に収集するのに役立つコマンドを追加したいだけです。これは、巨大なバックトレースを収集するときに非常に役立ちます。ロギング構成を行う前に、次のことを行ってください。

(gdb)set height 0

この記事で見つけました:https : //askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226226351332

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.