!!! ブレークポイントへの条件付き [if] 以下のソーティングプログラム[test1.c|https://ebwww.cis.iwate-u.ac.jp/~luxin/gdb/test1.c]をダウンロードする. 8< +include int sort(int x[], int n); void show(int x[], int n); void change(int x[], int j); +define NUM 3 int x[] = {3, 2, 1}; int sort(int x[], int n) { int i, j, temp; for (i = 0; i < n-1; i++) { for (j = n-1; j > i; j--) { if (x[j-1] > x[j]) { change(x, j); temp = x[j]; x[j] = x[j-1]; x[j-1]= temp; } } show(x, NUM); } } void show(int x[], int n) { int i; for (i = 0; i < n ; i++) printf("%d\t", x[i]); printf("\n"); } void change(int x[], int j) { printf("x[%d] = %d <-> x[%d] = %d\n", j-1, x[j-1], j, x[j]); } void main(void) { show(x, NUM); sort(x, NUM); } >8 以下のように,ソースファイルをコンパイルして実行ファイルを作る. 8< $ gcc test1.c -g -o test1 $ ./test1 3 2 1 x[1] = 2 <-> x[2] = 1 x[0] = 3 <-> x[1] = 1 1 3 2 x[1] = 3 <-> x[2] = 2 1 2 3 >8 実行ファイル test1 を引数として gdb を起動させる. 8< $ gdb test1 ... >8 change 関数のはじまりに到達してかつ j = 1 の場合だけ停止する条件をつけて,change 関数にブレークポイントを設定する. 8< (gdb) break change if j == 1 Breakpoint 1 at 0x400688: file test3.c, line 34. >8 run コマンドでプログラムを実行する. 8< (gdb) run Starting program: /home/staff/luxin/OLD/program1/test3 3 2 1 x[1] = 2 <-> x[2] = 1 Breakpoint 1, change (x=0x601028, j=1) at test3.c:34 34 j-1, x[j-1], j, x[j]); >8 change 関数のコードを表示する. 8< (gdb) list 29 printf("\n"); 30 } 31 32 void change(int x[], int j) { 33 printf("x[%d] = %d <-> x[%d] = %d\n", 34 j-1, x[j-1], j, x[j]); 35 } 36 37 void main(void) { 38 show(x, NUM); >8 print コマンドを使用して,変数の値を調べることができる. 8< (gdb) print j $1 = 1 (gdb) print x[j-1] $2 = 3 (gdb) print x[j] $3 = 1 >8 delete コマンドでブレークポイントを削除する.continue コマンドを使用してプログラムの最後まで実行して,quit コマンドで gdb を終了させる. 8< (gdb) delete 1 (gdb) continue Continuing. x[0] = 3 <-> x[1] = 1 1 3 2 x[1] = 3 <-> x[2] = 2 1 2 3 Program exited with code 02. (gdb) quit >8