web-dev-qa-db-ja.com

gdbにブレークポイントのリストを保存させますか?

OK、info breakはブレークポイントをリストしますが、--command この質問のように を使用してそれらを再利用するのにうまく機能するフォーマットではありません。 gdbには、それらを再度入力可能なファイルにダンプする方法がありますか?デバッグセッションでは、テスト用のブレークポイントセットを作成した後にgdbを再起動する必要がある場合があります。

編集:.gdbinitファイルには--commandと同じ問題があります。 info breakコマンドはコマンドをリストするのではなく、人間が消費するためのテーブルをリストします。

詳細を説明するために、情報ブレークのサンプルを次に示します。

(gdb)info break 
 NumタイプDisp EnbアドレスWhat 
 1ブレークポイントキープy 0x08048517 <foo :: bar(void)+7> 
121
casualcoder

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

191
aculich

この答えは時代遅れで、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が自動的にロードして実行します。これはディレクトリごとのファイルであるため、プロジェクトごとに異なるファイルを使用できます。

11
Paul Beckingham

ヨハネスの答えに対する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で保存されたブレークポイントを復元できます。

9
Dan Berindei

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で正常にテストされました。

6
anon
3
Abel

以下を〜/ .gdbinitに入れて、ブレークポイントを保存および復元するgdbコマンドとしてbsaveおよびbrestoreを定義します。

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end
3
badeip

私はこれが古いスレッドであることを知っていますが、これを支援するためにグーグル検索で出てきました。私はgdbが初めてであり、特定のファイルにブレークポイントを保存/ロードするために、上記の回答に次の追加が役立つことがわかりました。

  • ブレークポイントを保存:bsave {filename}
  • ブレークポイントのロード:bload {filename}

上記のように、ファイル〜/ .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
1
Mark A

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

TUIモードでロギングを有効にしようとすると、GDBでこのエラー/警告が表示されますが、「非TUI」モードではロギングが機能するようです。だから、何かを記録したいときはいつでもTUIモードを終了します。 (CTRL-XCTRL-AでTUIモードを前後に切り替えます)。

私が働く方法は次のとおりです。

  1. gDBを起動します(通常モード)
  2. ロギングを有効にします: set logging on-今は文句を言うべきではありません。
  3. tUIモードに前後に切り替えて、GDBの操作を行います
  4. 何かを記録したいときはいつでも(巨大なバックトレースダンプなど)-通常モードに切り替えます

これがお役に立てば幸いです、/ M:o)

1
Magnux

問題は、ブレークポイントの設定が状況依存であるということです。 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によって実行されているかどうかを検出する方法 を参照してください。

0
badeip

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

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
0
noisy

問題は、ブレークポイントの設定が状況依存であるということです。 fooという名前の2つの静的関数がある場合はどうなりますか? fooを定義するモジュールの1つをすでにデバッグしている場合、gdbは、そのモジュールを意味すると想定します。しかし、「break foo」をファイルにダンプし、起動時にそのファイルを読み込むだけでは、どの関数fooを意味するのかが明確になりません。

0
Michael Snyder