11

GDBデバッグC++コードの場合:15個のブレークポイントを戦略的に設定していますが、ブレークポイント#2に到達するまでそれらのいずれもアクティブにしたくありません。GDBにrun-until-breakpoint- nコマンドはありますか?

代わりに、次の2つのいずれかを実行しています。

  1. 他のすべてのブレークポイントを削除して、#2がすべて存在するようにし、実行して、すべてのブレークポイントを再度追加します。また

  2. continue#2で最初の休憩が表示されるまで、すべての休憩を繰り返し通過します。

run-until 2#2を除く他のすべてのブレークポイントを無視するが、それらを削除しないようなものが必要です。これは存在しますか?他の誰かがこれに対処するためのより良い方法を持っていますか?

4

4 に答える 4

11

enableブレークポイントを設定できます。これらのコマンドはrangedisableを受け入れます。これらのコマンドは、プログラムの実行中の重要なポイントで範囲を指定して使用します。

ブレークポイント#2について言及するときは、ブレークポイントの gdb 番号付けを参照していると思います。gdb セッションの簡単な例を次に示します。

(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep y   0x00001e15 in main at example.c:40
(gdb) disable 1-3
(gdb) enable 2
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep n   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep n   0x00001e15 in main at example.c:40
(gdb) 

現在、ブレークポイント #2 のみが有効になっています。プログラムを実行し、#2 で実行が中断されたら、目的のすべてのブレークポイントを範囲で再度有効にします。

(gdb) enable 1-3
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep y   0x00001e15 in main at example.c:40

ブレークポイントの番号と範囲を混在させることもできます:

(gdb) disable 1 4 6-7
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep n   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep y   0x00001e15 in main at example.c:40
4   breakpoint     keep n   0x00001e4f in main at example.c:43
5   breakpoint     keep y   0x00001e4f in main at example.c:44
6   breakpoint     keep n   0x00001e5e in main at example.c:45
7   breakpoint     keep n   0x00001e5e in main at example.c:46
于 2012-08-22T23:08:42.237 に答える
11

バージョン 7.0 以降、GDB は Python スクリプトをサポートしています。指定された番号のブレークポイントを除くすべての有効なブレークポイントを一時的に無効にし、GDBrunコマンドを実行する簡単なスクリプトを作成しました。

.gdbinit次のコードをファイルに追加します。

python
import gdb

class RunUntilCommand(gdb.Command):
    """Run until breakpoint and temporary disable other ones"""

    def __init__ (self):
        super(RunUntilCommand, self).__init__ ("run-until",
                                               gdb.COMMAND_BREAKPOINTS)

    def invoke(self, bp_num, from_tty):
        try:
            bp_num = int(bp_num)
        except (TypeError, ValueError):
            print "Enter breakpoint number as argument."
            return

        all_breakpoints = gdb.breakpoints() or []
        breakpoints = [b for b in all_breakpoints
                       if b.is_valid() and b.enabled and b.number != bp_num and
                       b.visible == gdb.BP_BREAKPOINT]

        for b in breakpoints:
            b.enabled = False

        gdb.execute("run")

        for b in breakpoints:
            b.enabled = True

RunUntilCommand()
end
于 2012-08-22T23:22:24.840 に答える
3

他のすべてのブレークポイントを削除するよりも少し苦痛が少ないでしょうdisable。そうすれば、ブレークポイントに関連付けられているすべてのものを再入力して元に戻す必要はなくenable、番号でもう一度入力するだけです。

于 2012-08-22T21:31:04.587 に答える
2

ブレークポイントを使用gdbすると、削除する代わりに無効にすることができます。次に、必要なときにそれらを再度有効にするだけです。

于 2012-08-22T21:31:26.137 に答える