GDBにブレークポイントのリストを保存させる


129

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

.gdbinitファイルには--commandと同じ問題があります。インフォブレークコマンドではなく、人間の消費のためのテーブルをコマンドを一覧表示するのではなく。

詳しく説明すると、次はinfo breakのサンプルです。

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

回答:


204

GDB 7.2(2011-08-23)以降、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>保存したブレークポイントをファイルから復元するために使用します。


2
それらが共有libロードからのものである場合はどうですか?デフォルトではNと応答しているようですが、Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
bjackfly 2014年

2
@bjackflyは、gdbスクリプトおよびgdbでYに応答set breakpoint pending onする方法で説明されているように使用します。--commandフラグを使用して将来の共有ライブラリにブレークポイントを設定する方法
aculich

起動(break g_log if log_level==G_LOG_LEVEL_CRITICAL)で解決できないブレークポイント条件がある場合、少なくともgdb 7.8.1はそれ以上のコマンドの解析を停止することに注意してください。そのブレークポイントに対して実行する必要がある追加のコマンドがある場合は、そのcommands行を行の前に置きますcondition
Lekensteyn 14

@Andryテキストはドキュメントからの逐語的な引用であるため、編集を元のブロック引用にロールバックしました。
aculich

@aculich:なるほど。どんな場合でも、コードスタイルではなく引用スタイルを使用することをお勧めします。
Andry

26

この回答は古くなっています。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-commandGDBコマンドラインに個別のを発行することもできます...

この小さなマクロを.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

カットアンドペーストも同じように簡単に使用できますが、スクリプトによる方法が適しているようです。
カジュアルコーダー、2009

1
カットアンドペーストは、スクリプトを1度だけ書いて、それをもう一度使用するよりも簡単だとは思いません。結局のところ、それが最初にこの質問をした理由だと思います:)
Johannesシャウブ-litb 2009

ええと、ロギングメソッドの代わりにカットアンドペーストを使用するつもりでした。これまでのところ、スクリプトは確かです。
カジュアルコーダー、2009

うわー!gdbは失敗します!私は毎日それを使用しており、その機能の多くが大好きです。しかし、不足は単なるばかげています。
deft_code 2009

4
現在、この回答は2年以上前のものであるため、新しいバージョンのgdbを使用している場合は廃止される可能性があります。gdb 7.2以降、このsave breakpointsコマンドを使用できるようになりました。
aculich

11

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


1
これは実際には機能しません。「警告:保存トレースポイント:保存するトレースポイントがありません」というメッセージが表示されます。これは、ブレークポイントが設定されているにもかかわらず、gdb 6.8を使用していた
カジュアルコーダー

これでうまくいきます。GDBには、コンテンツ「add-auto-load-safe-path /home/johnny/src/.gdbinit」を含むグローバル.gdbinitが$ HOME / .gdbinitに存在する必要があるため、src /フォルダーにも個別の.gdbinitがあります。
TruthAdjuster 2017

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


これはより良い正規表現です:perl -ne "print \" break \ $ 1 \ n \ "if /at\s(.*:\d+)/" brestore.txt
George Godik

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でのテストにも成功しました。


1
このスニペットをありがとう!よく働く。Mac OS 10.5.8上のCarbonEmacs GNU Emacs 22.3.1(i386-apple-darwin9.6.0、Carbonバージョン1.6.0)のGNU gdb 6.3.50-20050815(Appleバージョンgdb-966)でのテストに成功。
害虫駆除


3

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

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end

1

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

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

ここに私が働く方法があります:

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

ああ、そして「スクリーン」を使うのが好きなら(私と同じように)、同じホットキーを使用するため、少し面倒になります。
Magnux

1

特定のファイルにブレークポイントを保存/ロードするために、以前の回答に次の追加が役立つことがわかりました。

  • ブレークポイントを保存: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

0

問題は、ブレークポイントの設定が状況依存であることです。fooという名前の2つの静的関数がある場合か?

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


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