SSブログ

デバッグを支える知識 [プログラマー現役続行]

ソフトウェアのデバッグでは、不具合の現象を観察し、ソースコードを調べたり、デバッガーを使用したりして原因に対する仮説を立てます。仮説を立てて、それを証明していくことになります。証明といっても、仮説通りの動きをしているかを確認するためのデバッグ文であったりします。

仮説を立てるには知識が必要です。自分が持っている知識の範囲内でしか仮説を立てることはできません。

たとえば、C言語のコードで、 int型へのポインターptrを通して、*ptr としてポインタの指す先を参照したとします。この参照がx86系のCPUでは動作して、他の種類のCPUでは動作しない場合があります。ptrの指す先のアドレスが4バイト境界を指していない場合には、CPUによっては正しく動作しないという知識を持っている人は、それが原因であるという仮説を立てることになります。そして、それを証明するためにデバッグ文を入れてアドレスを確認する訳です。そして、4バイト境界を指していないと分かったら適切な修正を行います。一方、CPUに関する知識がない人は、デバッグ文を入れてアドレスを表示させることは行うかもしれませんが、そのアドレスを見ても何が悪いのかは分かりません。そして、試行錯誤を行うことになります。

別の例としては、Javaで特定のクラスのインスタンスをnewで生成するコードが戻ってこなく、どうもコンストラクタの処理の中で止まっているように見える場合があります。①本当に止まっている場合と、②実は、RuntimeExceptionがスローされて誰もそれをキャッチしていない上に、そのスレッドを動作させているThreadGroupがキャッチされなかった例外を表示しないようにもみ消すようなシステムが作られている場合があります。後者の場合、キャッチされなかった例がどのように処理されるのかという知識がないと仮説として立てることもできなかったりします。

残念ながらこのような知識は、バグに直面して一人でデバッグしている時に得られるものではありません。運良く、相談できる経験のある人が居れば解決できるかもしれません。そうでなければ、一時間で解決することが、数時間や数日かかってしまうことがあります。

ソフトウェアエンジニアとしては、継続した学習を通して、知識も増やしながら、ソフトウェア開発を実践していく必要があります。そして、各人の自己学習だけでなく、仲間同士による勉強会や、強制的に学習を強いられる私が行っているような「プログラミング言語Java」教育などが必要となってきます。