変数が設定した値と等しいときに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でこれは可能ですか?
ブレークポイント内にネストされたウォッチポイントに加えて、「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
これにはウォッチポイントを使用できます(コードの代わりにデータのブレークポイント)。
watch i
を使用して開始できます。
次に、condition <breakpoint num> i == 5
を使用して条件を設定します
info watch
を使用してブレークポイント番号を取得できます
まず、適切なフラグを使用してコードをコンパイルし、コードへのデバッグを有効にする必要があります。
$ 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)
ハードウェアとソフトウェアのウォッチポイントがあります。これらは、変数の読み取りおよび書き込み用です。チュートリアルを参照する必要があります。
http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html
ウォッチポイントを設定するには、まず、環境内で変数iが存在する場所にコードを分割し、ウォッチポイントを設定する必要があります。
watch
コマンドを使用して、書き込み用の監視ポイントを設定し、rwatch
を読み取り用に、awatch
を読み取り/書き込み用に設定します。