GNU/Linux >> Linux の 問題 >  >> Linux

awatch rwatch を使用した GDB ブレークポイントとウォッチポイントの例

このチュートリアルでは、条件付きブレークポイントやウォッチポイントなど、いくつかの高度な 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


Linux
  1. BashForループガイドと例

  2. gdbを使用してLinuxでCプログラムをデバッグする方法

  3. Bash の For ループと While ループの例

  1. exclude-from を使用して複数のファイルとディレクトリを除外する 6 つの rsync の例

  2. Linux の Nice および Renice の例を使用してプロセスの優先度を変更する方法

  3. Linux での dmsetup コマンドの使用例

  1. Linux Catコマンド:使用法と例

  2. Linuxコマンド-概要と例

  3. IPアドレスとは? IPv4 および IPv6 アドレスの例