多スレッドプロセスのデバッグ
今日もプログラミングネタです。
先日メモリーリークを修正した話題を書きましたが、そのプログラムを連続稼働させると、2時間程度で異常終了することに気がつきました。コアダンプするようにしてスタックの状態を調べると、本来そこは通らないはずの部分です。1プロセスで2400スレッド以上動いていて、しかもスレッドは生成されては消滅し、という動作を繰り返していて、デバッガを使ってもそう簡単に追えません。
こんな時はログ出力が役立ちます。大体ポイントは絞れていますので、その付近にスレッドIDやキーになる番号をつけてデバッグ用のログを仕込み、実行してみます。今回苦労したのは、なかなか現象が発生しない点で、何しろ2時間程度連続稼働させて起きるかどうか、という感じですので、実行して絞り込んでさらにログを追加して、という繰り返しにとても時間がかかるのです。
まあ、何とかこのフラグにあるスレッドが反応していないということまではわかったのですが、なぜ反応しないのかがわからず・・・頭を抱えながらソースとログを眺め、デバッガであれこれ調べていると・・・なんと、たまたまあるスレッドからの指令が遅い場合に余計なループを1回実行してしまい、そこで別のフラグで引っかかっていたのでした(良くわからんと思いますが)。
多スレッドのプロセスのデバッグはとても大変、というだけのネタですが・・・。
複雑なスレッド構成になっているのは、対象システムの処理の流れが複雑だからです。仕様がプログラミング面を抜きに作られるとこういうことになりがちです。まあ、今回がそうとは言いませんが。アルゴリズム設計が悪くて複雑になる場合・仕様が複雑でプログラムも複雑になる場合、度重なる仕様変更でソースがひどい状態になる場合(意外とこれが多い気がしますね!)など、原因はいろいろありますが、いずれにしても、できるだけシンプルなプログラムにしておかないと結構苦労します。
また、たまにしか起きない問題だからと、目をつぶってリリースしてしまうと後で必ず痛い目にあいます。意地でも解明しないと駄目です!
この問題のせいで、家に帰ってからも2時間おきくらいにログを追加して実行して・・・を繰り返し、寝不足です。