OK、info breakはブレークポイントをリストしますが、--command この質問のように を使用してそれらを再利用するのにうまく機能するフォーマットではありません。 gdbには、それらを再度入力可能なファイルにダンプする方法がありますか?デバッグセッションでは、テスト用のブレークポイントセットを作成した後にgdbを再起動する必要がある場合があります。
編集:.gdbinitファイルには--commandと同じ問題があります。 info breakコマンドはコマンドをリストするのではなく、人間が消費するためのテーブルをリストします。
詳細を説明するために、情報ブレークのサンプルを次に示します。
(gdb)info break NumタイプDisp EnbアドレスWhat 1ブレークポイントキープy 0x08048517 <foo :: bar(void)+7>
Gdb 7.2から、save breakpointsコマンドを使用できるようになりました。
save breakpoints <filename>
Save all current breakpoint definitions to a file suitable for use
in a later debugging session. To read the saved breakpoint
definitions, use the `source' command.
つかいます source <filename>
保存されたブレークポイントをファイルから復元します。
この答えは時代遅れで、gdbは直接保存をサポートするようになりました。 この回答 。を参照してください
ロギングを使用できます:
(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x08049329 <main+16>
(gdb) q
ファイルbreaks.txtには次が含まれます。
Num Type Disp Enb Address What
1 breakpoint keep y 0x08049329 <main+16>
それを.gdbinit
または--command
ファイルに役立つ形式に変換するawkスクリプトを書くのは簡単です。または、スクリプトから個別の--eval-command
をgdbコマンドラインに出力させることもできます...
この小さなマクロを.gdbinitに追加すると、実行しやすくなります。
# call with dump_breaks file.txt
define dump_breaks
set logging file $arg0
set logging redirect on
set logging on
info breakpoints
set logging off
set logging redirect off
end
Gdb>プロンプトで入力するのと同じように、gdbコマンドとブレークポイントを.gdbinitファイルに配置すると、起動時にgdbが自動的にロードして実行します。これはディレクトリごとのファイルであるため、プロジェクトごとに異なるファイルを使用できます。
ヨハネスの答えに対するanonの拡張の拡張:
.gdbinit:
define bsave
Shell rm -f brestore.txt
set logging file brestore.txt
set logging on
info break
set logging off
# reformat on-the-fly to a valid gdb command file
Shell Perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
store actual breakpoints
end
define brestore
source brestore.gdb
end
document brestore
restore breakpoints saved by bsave
end
brestore
を使用すると、bsave
で保存されたブレークポイントを復元できます。
Johannesからの回答の拡張:info break
の出力を有効なgdbコマンドファイルに自動的に再フォーマットできます。
.gdbinit:
define bsave
Shell rm -f brestore.txt
set logging file brestore.txt
set logging on
info break
set logging off
# reformat on-the-fly to a valid gdb command file
Shell Perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
store actual breakpoints
end
その後、brestore.gdb
に有効なコマンドファイルがあります
これは、アプリケーションが-g
でコンパイルされたときにうまくいきました。
[〜#〜] edit [〜#〜]:Ubuntu Karmicのgdb v6.8で正常にテストされました。
以下を〜/ .gdbinitに入れて、ブレークポイントを保存および復元するgdbコマンドとしてbsaveおよびbrestoreを定義します。
define bsave
save breakpoints ~/.breakpoints
end
define brestore
source ~/.breakpoints
end
私はこれが古いスレッドであることを知っていますが、これを支援するためにグーグル検索で出てきました。私はgdbが初めてであり、特定のファイルにブレークポイントを保存/ロードするために、上記の回答に次の追加が役立つことがわかりました。
上記のように、ファイル〜/ .gdbinitに次のコードを追加します
#Save breakpoints to a file
define bsave
if $argc != 1
help bsave
else
save breakpoints $arg0
end
end
document bsave
Saves all current defined breakpoints to the defined file in the PWD
Usage: bsave <filename>
end
#Loads breakpoints from a file
define bload
if $argc != 1
help bload
else
source $arg0
end
end
document bload
Loads all breakpoints from the defined file in the PWD
Usage: bload <filename>
end
警告:現在の出力プロトコルはリダイレクトをサポートしていません
TUIモードでロギングを有効にしようとすると、GDBでこのエラー/警告が表示されますが、「非TUI」モードではロギングが機能するようです。だから、何かを記録したいときはいつでもTUIモードを終了します。 (CTRL-X、CTRL-AでTUIモードを前後に切り替えます)。
私が働く方法は次のとおりです。
set logging on
-今は文句を言うべきではありません。これがお役に立てば幸いです、/ M:o)
問題は、ブレークポイントの設定が状況依存であるということです。 fooという名前の2つの静的関数がある場合はどうなりますか? fooを定義するモジュールの1つをすでにデバッグしている場合、gdbは、そのモジュールを意味すると想定します。しかし、「break foo」をファイルにダンプし、起動時にそのファイルを読み込むだけでは、どの関数fooを意味するのかが明確になりません。
返信するmodポイントはありませんが、ソースファイルと行番号を指定して、ブレークポイントを明示的にすることです。 foo。)がfoo.c:42とbar.c:1337の両方で指定されている場合
break foo.c:42
break bar.c:1337
または、プログラムがgdbで実行されている場合にのみトリガーするソース内ブレークポイントを指定します。 現在のプロセスがGDBによって実行されているかどうかを検出する方法 を参照してください。
他のアイデアはありますか?私は持っています
warning: Current output protocol does not support redirection
後
set logging on
編集:
私は質問が「ブレークポイントのリストを保存する方法」であることを知っていますが、gdbを使用して「ファイルに保存」ブレークポイントを設定できることを発見しました。
gdb> source breakpoints.txt
ここで、breakpoints.txtは次のようなファイルです。
break main.cpp:25
break engine.cpp:465
break wheel.cpp:57
問題は、ブレークポイントの設定が状況依存であるということです。 fooという名前の2つの静的関数がある場合はどうなりますか? fooを定義するモジュールの1つをすでにデバッグしている場合、gdbは、そのモジュールを意味すると想定します。しかし、「break foo」をファイルにダンプし、起動時にそのファイルを読み込むだけでは、どの関数fooを意味するのかが明確になりません。