next up previous contents index
: 章末の問題 : デバッガ(より進んだ使い方) : ブレークポイント, トレースの使用   目次   索引

実行中断

ブレークポイントで止まってくれるのはまだマシな方で, いつまでたっても 止まらないプログラムを書いてしまうことはよくある. 次の例は, N の階乗 を計算するつもりのプログラムである.

def factorial(N)
{
  F = 1;
  for ( I = 1; I <= N; J++ )
    F *= I;
  return F;
}       
end$

    
これを実行すると止まらない.

[100] factorial(3);
interrupt ?(q/t/c/d/u/w/?)

    
Ctrl-C を打ってみる. このプロンプトの意味は, ? を入力してみれば表示される. ここでは d と入力して, デバッグモードに入る.

(debug) where
#0 factorial(), line 5 in
"./factorial"
(debug) list factorial
1   def factorial(N)
2   {
3       F = 1;
4       for ( I = 1; I <= N; J++ )
5           F *= I;
6           return F;
7   }
8   end$
(debug) print I
I = 1
(debug)

    
ずいぶん待っているのに, I が増えていないので, 回りをじっと 眺めると, I++ となるべきところが J++ となっている. 試しに J の値を見てみると
(debug) print J
J = 4120134
ととんでもないことになっている.

この例も人工的であるが, 実際にはよく あることである. ちょっと長めのプログラム中でこのような些細なミスを 発見するのは, プログラムを眺めているだけでは見つかりにくいが, 中断からデバッグモード移行, という方法を使うと一発で見つかる場合が多い.

余談 (by N): (N) は Asir に限らずデバッガ依存型で, いい加減にプログラム を書いてはデバッガを頼りに修正していくという素人的プログラミングを長年 続けている. 著者 (T) は, どうもそうではないらしく, どうやらソースコー ドをじっと眺めてたちどころにバグを見つけ出す, というプロフェッショナル なプログラミングをしているらしいが, 見たことがないので定かではない. もっ とも, バグが入ったプログラムを書くようでは真のプロとは言えないという話 もあるので, 五十歩百歩かもしれない.



Nobuki Takayama 平成15年9月12日