next up previous contents index
: 実行中断 : デバッガ(より進んだ使い方) : デバッガ(より進んだ使い方)   目次   索引

ブレークポイント, トレースの使用

どこがおかしいかはまだ分からないが, とりあえず, 実行中のある時点で の変数の値を見て考えよう, ということはよくある. このような場合, プログラム中に print の呼び出しを入れることで値を見ることはできるが,

などの欠点がある. このようなときブレークポイント, トレースが便利である.

たとえば, 行列の積を計算するつもりで次のプログラムを書いたとしよう.

プログラム

def mat_mul(A,B)
{
  SA = size(A);
  SB = size(B);
  if ( SA[1] != SB[0] )
    error("mat_mul:size mismatch");
  N = SA[0]; L = SA[1]; M = SB[1];
  C = newmat(SA[0],SB[1]);
  for ( I = 0; I < N; I++ )
    for ( J = 0; J < M; J++ ) {
      for ( K = 0; K < L; K++ )       
        T += A[I][K]*B[K][J];
        C[I][J] = T;
    }
  return C;
}

    
実行結果
[100] A = newmat(2,2,[[1,2],[3,4]]);
[ 1 2 ]
[ 3 4 ]
[101] mat_mul(A,A);
[ 7 17 ]
[ 32 54 ]
手で計算してみると, (0,0) 成分以外は全部おかしい. そこでデバッグモード に入ってブレークポイントを設定する.

[102] debug;
(debug) list mat_mul
1       def mat_mul(A,B)
2       {
3               SA = size(A);
4               SB = size(B);
5               if ( SA[1] != SB[0] )
6                       error(``mat_mul : size mismatch'');
7               N = SA[0]; L = SA[1]; M = SB[1];
8               C = newmat(SA[0],SB[1]);
9               for ( I = 0; I < N; I++ )
10                      for ( J = 0; J < M; J++ ) {
(debug) list
11                              for ( K = 0; K < L; K++ )
12                                      T += A[I][K]*B[K][J];
13                              C[I][J] = T;
14                      }
15              return C;
16      }
17      end$
(debug)

(debug) stop at 11
(0) stop at "./mat_mul":11
(debug) quit
[103] mat_mul(A,A);
stopped in mat_mul at line 11 
in file "./mat"
11     for ( K = 0; K < L; K++ )
(debug) print [I,J]
[I,J] = [0,0]
(debug)

    
とりあえず, 11 行目にブレークポイントを設定して実行してみる. 11 行目で止まったら, (0,0) 成分を表示してみる.

(debug) cont
stopped in mat_mul at line 11 
in file "./mat"
11    for ( K = 0; K < L; K++ )
(debug) print [I,J]
[I,J] = [0,1]
(debug)

    
(0,0) 成分は正しいので, (0,1) 成分の計算まで行く. これは コマンド cont (continue) を使う.

(debug) next
stopped in mat_mul at line 12
in file "./mat"
12     T += A[I][K]*B[K][J];
(debug) print T
T = 7
(debug)

    
次の行まで行く. これはコマンド next を使う. 止まったら, T の値を表示してみると, 積和計算用の変数 T が既に値を持っている. 要するに, 単なる T の初期化のし忘れだった.

この例はあまりに人工的であるが, 使い方の雰囲気は分かってもらえると思う. なお, トレースというのは, デバッグモードに入らずに, 指定された場所で 値を表示する機能である.

(debug) trace T at 13
(0) trace T at "./mat_mul":13
(debug) quit
[101] mat_mul(A,A);
7
17
32
54
[ 7 17 ]
[ 32 54 ]
[102]

    
13 行目にきたら, T の値を表示するように指示した.



Nobuki Takayama 平成15年9月12日