141

OK、info breakはブレークポイントを一覧表示しますが、この質問のように--command を使用してそれらを再利用するのに適した形式ではありません。GDB には、再度入力できるファイルにそれらをダンプする方法がありますか? デバッグ セッションでは、テスト用に一連のブレークポイントを作成した後に GDB を再起動する必要がある場合があります。

.gdbinit ファイルには --command と同じ問題があります。info breakコマンドは、コマンドを一覧表示するのではなく、人間が使用するための表を一覧表示します。

詳しく説明するために、 info breakのサンプルを次に示します。

(gdb) 情報ブレーク
Num Type Disp Enb Address What
1 ブレークポイント キープ y 0x08048517 <foo::bar(void)+7>
4

11 に答える 11

224

GDB 7.2 (2011-08-23) 以降、ブレークポイントの保存コマンドを使用できるようになりました。

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>保存したブレークポイントをファイルから復元するために使用します。

于 2010-10-21T03:51:19.677 に答える
11

プロンプトで入力するのと同じように、GDB コマンドとブレークポイントを.gdbinit ファイルgdb>に入れると、GDB は起動時にそれらを自動的にロードして実行します。これはディレクトリごとのファイルであるため、プロジェクトごとに異なるファイルを持つことができます。

于 2009-02-01T20:18:57.657 に答える
9

ヨハネスの答えに対するアノンの拡張への拡張:

.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

于 2010-05-27T13:35:37.083 に答える
6

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

また、 Ubuntu 9.10 (Karmic Koala)で GDB v6.8 を使用してテストすることにも成功しました。

于 2010-02-09T23:03:09.530 に答える
4

~/.gdbinitに以下を記述して、 bsavebrestoreを GDB コマンドとして定義し、ブレークポイントを保存および復元します。

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end
于 2013-08-27T08:00:58.197 に答える
3

おそらくこれ:

save breakpoints [filename]

于 2010-07-19T14:10:45.797 に答える
1

警告:現在の出力プロトコルはリダイレクトをサポートしていません

TUIモードでロギングを有効にしようとすると、GDBでもこのエラー/警告が表示されます。ただし、「非TUI」モードの場合、ロギングは機能するようです。そのため、何かをログに記録したいときはいつでもTUIモードを終了します。Ctrl( +XCtrl+Aを使用してTUIモードに切り替えます)。

私の仕事の仕方は次のとおりです。

  1. GDBを起動します(通常モード)
  2. ロギングを有効にする:set logging on-これで文句を言わないはずです。
  3. 前後にTUIモードに切り替えて、GDBの処理を実行します
  4. 何かをログに記録したいときはいつでも(巨大なバックトレースダンプのように)-通常モードに切り替えます
于 2010-08-09T12:14:11.150 に答える
0

他のアイデアはありますか?私は持っています

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
于 2010-07-01T15:14:01.227 に答える
0

問題は、ブレークポイントの設定がコンテキストに依存することです。fooという名前の2つの静的関数がある場合はどうなりますか?

fooを定義するモジュールの1つを既にデバッグしている場合、GDBはそのモジュールを意味していると見なします。しかし、「break foo」をファイルにダンプし、起動時にそのファイルを読み取るだけでは、どの関数fooを意味するのかが明確になりません。

于 2009-10-28T20:52:07.387 に答える