Lucky Life Manのブログ

日記の延長みたいなもの

解決できないプログラム不具合の意外な解決法

正しいソース

 チームでプログラム開発している中で同じプログラムを使用

 しているにも関わらず、あなたの作成したプログラム部分が

 意図した動きをしない(バグがあるぞ)という連絡が入った。

 会社ごとに機能を決めて開発していたが、自分の会社の環境

 では問題なく動いていたので、プログラムのバージョンが古

 いか環境等の違いなどではないかと軽い気持ちで連絡をくれ

 た会社に乗り込み、状況を見せてもらった。

 確かに、意図した動きをしない。(C++で作成していた時代)

 そこで、インクルード等も含めたプログラムバージョン、開

 発環境等を調べたが、自分の会社で正常に動作している環境

 と全く同じであった。

 デバッグモードで、ブレークポイントを張り、不具合箇所を

 見つけた。がしかし、自分の会社で開発しているソースと寸

 分だがわず、全く同じソースであった。

 マシンを立ち上げなおしたり、当該プログラムに影響を与え

 そうな、DLLファイル等すべて調べたが、うまく動作しない。

 そこで、アセンブラに展開し、アセンブラにブレークポイン

 トをはり、不具合!?調査をすることにした。

 

アセンブラにして顕在化した不具合

 アセンブラブレークポイントをはり、不具合!?調査を開

 始して、すぐに原因がわかった。ある値が格納されるはずの

 レジスタに値が格納されないのだ。C++上、ソースは同じな

 ので、アセンブラにしなければ、わからなかった。

 が、どうしてそうなるのか、わからなかった。C++のソース

 のデバッグと同様な(上記)調査をしたが、やっぱりわから

 ない。相手からと、元々動いてないんじゃないのというよう

 な視線がずきずき刺さってくるのがわかった。しょうがない

 ので、連絡してきた相手を自分の会社に呼んで、疑いを晴ら

 すしかないかと思い、何気なく、インクルードファイルの順

 番を変えて、コンパイルしなおし、デバック!?してみたと

 ころ、レジスタに意図した値が入るようになったではないか。

 原因がインクルードファイルの順番かどうか、証明するため

 うまくいかなかったときのインクルードファイルの順番に戻

 し、コンパイルしたところ、不具合が再現した。

 連絡してきた連中になぜかわからないが、インクルードファ

 イルの順番が原因だということを説明し、正常な動作を確認

 した。オープンソースコンパイラに不具合があるとたまに

 聞くが、こんなところで、その不具合にぶち当たるとは思わ

 なかった。

 くさいものにふたをするではないが、不具合を代替手段でカ

 バーするというのはよくある話であるが、そのときは、その

 方法がとれず、本当に困った。

 どうしても解決できないプログラムの不具合に多数ぶちあた

 ってきたが、そのうちのいくつかはコンパイラの不具合かも

 と思うようになった。(ほんの数%か、それ以下とは思うが)

 

アセンブラは勉強しておいた方がいい

 現在のコンパイラは最適化等大変複雑なコンパイルをしている

 ため、そう容易には不具合が見つけられないと思うが、アセン

 ブラは勉強しておいて、損はないのではないか。