GDB:変数が値と等しい場合に中断


89

変数が設定した値と等しいときにGDBにブレークポイントを設定させたいので、次の例を試しました。

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

GDBからの出力:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

ご覧のように、GDBはブレークポイントを作成しませんでしたが、これはGDBで可能ですか?

回答:


123

ブレークポイント内にネストされたウォッチポイントに加えて、 'filename:line_number'に単一のブレークポイントを設定して、条件を使用することもできます。私はそれが時々簡単だと思います。

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

行番号の変更にうんざりしている場合は、ラベルを追加してから、次のようにラベルにブレークポイントを設定できます。

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5

30

これにはウォッチポイントを使用できます(コードの代わりにデータのブレークポイント)。

を使用して開始できwatch iます。
次に、それを使用して条件を設定しますcondition <breakpoint num> i == 5

ブレークポイント番号を取得するには、 info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
コード内のi存在する場所にいる必要があります。試してみてくださいbreak mainruncsその後、答えのコマンドを(ステップは必ず宣言を乗り越える作るために)、および。必ず-gフラグを付けてプログラムをコンパイルしてください。(つまり、デバッグ情報付き)
2013年

9

まず、適切なフラグを使用してコードをコンパイルし、コードへのデバッグを有効にする必要があります。

$ gcc -Wall -g -ggdb -o ex1 ex1.c

次に、お気に入りのデバッガーでコードを実行します

$ gdb ./ex1

コードを見せて。

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

5行目で改行し、i == 5かどうかを調べます。

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

ブレークポイントの確認

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

プログラムを実行する

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)

4

ハードウェアとソフトウェアのウォッチポイントがあります。これらは、変数の読み取りおよび書き込み用です。チュートリアルを参照する必要があります:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

ウォッチポイントを設定するには、最初に、環境内でバリアントiが存在する場所にコードを分割し、ウォッチポイントを設定する必要があります。

watchコマンドは、書き込みrwatch用、読み取り用、およびawatch読み取り/書き込み用に監視ポイントを設定するために使用されます。

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