落ちる

仕事で使っているプログラムが、ある日突然、動かなくなった。いや、正確には動く場合もある、なのだ。ボクのデスクトップ端末(Windowsではありません。Solarisです。)から起動しようとすると落ちるが、他の端末からなら起動できるのだ。まあ、他の端末から起動すればいいから、とりあえず、このアプリをメンテしている同僚にメールで症状だけ伝えて放置していた。

放置していたら、今度は別のプログラムも全く同様の症状を見せ始めた。今度は、ボクがメンテしているものなので、いよいよ放置しておくわけにも行かなくなってきた。調べてみると、とあるライブラリの中で落ちている。これは、やはりうちのチームで作っているライブラリなので、メンテしている別の同僚にメールして調査を依頼すると同時に、自分でも少し掘ってみた。

ある端末からは起動できて、別のところではダメ。こういうときには、インストールされているライブラリのバージョンが違ったり、OSのバージョンが違ったりすることが原因だったりするので、チェックしてみるが、これは全く同一で、問題はないことが判明。となると、あとは、シェルの環境変数の違いくらいしかない。調べてみると、あんまり沢山違うので、呆然。とりあえず、PATHを動く方にそろえてみたがダメ。あれこれ、環境変数を変えたり削除したり設定したりして試しているうちに、行き当たった。TZだ oTL

TZは、タイムゾーンを保持する環境変数。これが、クラッシュを起こすシェル上にはなかった。同じ端末でも別にシェルを起こして、TZを設定しておくと、クラッシュしていたものたちも問題なく動く。これを手がかりに、TZに触っているヒトを探してみたら、いた。

return std::string(std::getenv("TZ"));

くはぁ oTL
これじゃあ、ダメですがな。NULL渡ったら、stringクラス、クラッシュしますがな(/_T)

const char *tz = std::getenv("TZ");
return std::string(tz ? tz : "");
と、このように、直してくれるように、頼んでおいたので、そのうち直るだろう。こういうチェック漏れ、自分でもつい、やってしまうので、気をつけないといけない。