このチュートリアルでは、条件付きブレークポイントやウォッチポイントなど、いくつかの高度な GDB 関数について説明します。
これらの GDB デバッガーの概念を説明するための例として、単純な C プログラムも使用しました。
GDB 条件付きブレークポイント
ブレークポイントは、プログラムが特定の場所に到達するたびにブレーキをかけます。ブレークポイントの条件を指定することもできます。条件はブール式です。条件付きブレークポイントは、ブール式が TRUE と評価された場合にのみブレークします。
for ループで関数を呼び出しており、500 回ごとにプログラムがクラッシュしているとします。条件付きブレークポイントは、条件を設定し、条件が一致した場合にのみ実行を中断できる状況で役立ちます。
#include <stdio.h> int main() { int i=0; for (i=0;i<1000;i++) { printf("%d\n",i); } }
(gdb) b 8 if i=500 Breakpoint 2 at 0x400524: file a.c, line 8. (gdb) run Starting program: /home/lakshmanan/./a.out Breakpoint 1, main () at a.c:6 6 int i=0; (gdb) c Continuing. Breakpoint 2, main () at a.c:8 8 printf("%d\n",i); (gdb) p i $1 = 500
上記の gdb セッションでは、i の値が 500 になるとプログラムが中断します。
ウォッチポイントとは?
ウォッチポイントは、以前の GDB – ブレークポイントの記事で説明したブレークポイントに似ています。ただし、関数またはコード行に設定されるブレークポイントとは異なり、ウォッチポイントは変数に設定されます。これらの変数が読み書きされると、ウォッチポイントがトリガーされ、プログラムの実行が停止します。
監視する変数は現在のスコープ内にある必要があることに注意してください。そのため、変数のスコープ内にブレークポイントを設定して、変数を監視してください。
#include <stdio.h> int main() { int a=10; int b=15; b = a+b; printf("%d\n",b); }
$ cc -g watch.c -o watch
「awatch」を使用して読み取り/書き込みウォッチポイントを設定する
awatch コマンドを使用して、変数に読み取り/書き込みウォッチポイントを設定します。 awatch の構文は、「awatch」の後に変数名が続きます。
$ gdb ./watch (gdb) break 1 Breakpoint 1 at 0x400514: file a.c, line 1. (gdb) run Starting program: /home/lakshmanan/Personal/./a.out Breakpoint 1, main () at a.c:4 4 int a=10; (gdb) awatch b Hardware access (read/write) watchpoint 2: b (gdb) n 5 int b=15; (gdb) n Hardware access (read/write) watchpoint 2: b Old value = 0 New value = 15 main () at a.c:7 7 b = a+b; (gdb) n Hardware access (read/write) watchpoint 2: b Old value = 15 New value = 25 main () at a.c:9 9 printf("%d\n",b);
上記の例では、指定された変数が読み書きされるたびに、gdb は古い値と新しい値を出力し、プログラムの実行を停止します。
「rwatch」を使用して変数の読み取りウォッチポイントを設定する
rwatch は、gdb で読み取りウォッチポイントを設定するために使用されるコマンドです。設定すると、指定された変数が読み取られるたびに、プログラムの実行が停止します。構文は「awatch」に似ています。
(gdb) rwatch b Hardware read watchpoint 2: b (gdb) c Continuing. Hardware read watchpoint 2: b Value = 25 0x000000000040052b in main () at a.c:9 9 printf("%d\n",b);
同様に、「watch」を使用して gdb に書き込みウォッチポイントを設定できます。
ウォッチポイントの削除
ウォッチポイントは、ブレークポイント リストに表示されます。
そのため、情報ブレークポイントを使用してウォッチポイントを一覧表示し、以下に示すようにブレークポイントと同様に削除/無効化できます。
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400514 in main at a.c:1 breakpoint already hit 1 time 2 hw watchpoint keep y b breakpoint already hit 1 time (gdb) delete 2