2009年1月4日の日記の2番目の記事へのコメント
■uim-el-agentがメモリリークしているらしい問題
とりあえず再現環境を作るべく dbskkd-cdb をインストール.嫌々 daemontools を入れたんですが,そこから先,何をどうすればよいのかわからず困ってググってみたら実は daemontools とか全然要らないことが判明 orz .あーでも T60 には inetd も xinetd も入れてないんだよなぁ.そこは tcpserver 使うか・・・.最終的に freecdb + tinycdb + dbskkd-cdb + ucspi-tcp でどうにか落ち着きました.xinetd にすれば djb free になるのかw? ちなみに Twitter で make が pmake 依存だとか daemontools のドキュメント熟読するとかありえんとかぶつくさ言ってたら作者に捕捉されてしまいましたよ (;´Д`)'`ァ'`ァ .どうやって知ったんだろうw
で,肝心のリークですが,確かに何かあるっぽいです.そして,驚くべきことに,別にSKKでなくても余裕で発生することが明らかになりました _|‾|○.単純にuim-el-agentの中でコンテキストを作って解放することを繰り返すだけでも発生します・・・.こんなのでもOK.top して見てるとじわじわとメモリの消費量が増えていく様子が確認できますw
% while : ; do echo 1 1 NEW EUC-JP echo 2 1 RELEASE done | uim-el-agent > /dev/null
うぬぬ,valgrind 走らせてみるか・・・.
==12632== 2,208 bytes in 2 blocks are definitely lost in loss record 5 of 5 ==12632== at 0x40224C0: malloc (vg_replace_malloc.c:149) ==12632== by 0x41A586F: strdup (strdup.c:43) ==12632== by 0x804E8BE: update_prop_list (prop.c:65) ==12632== by 0x804D8D7: prop_list_update_cb (callback.c:142) ==12632== by 0x4049B01: im_update_prop_list (uim-func.c:252) ==12632== by 0x40357A4: call (eval.c:417) ==12632== by 0x403242C: scm_eval (eval.c:499) ==12632== by 0x4032C03: scm_s_begin (syntax.c:830) ==12632== by 0x40331EB: scm_s_body (syntax.c:799) ==12632== by 0x40348AB: call_closure (eval.c:221) ==12632== by 0x4035663: call (eval.c:283) ==12632== by 0x403242C: scm_eval (eval.c:499) ==12632==
キタ━━━━(゜∀゜)━━━━ッ!! どう見ても uim-el-agent で漏れまくってます.・・・あー,prop.c のこれ↓か (;´Д`)
if (prop->list != NULL) free(prop->list); prop->list = strdup(str);
確かにここは uim-el-agent のコンテキスト解放時に捨ててねーや _|‾|○ .というわけで,ひとまず以下のように修正.
--- context.c (リビジョン 5684) +++ context.c (作業コピー) @@ -306,6 +306,7 @@ /* free others */ free(ua->encoding); free(ua->im); + free(ua->prop->list); free(ua->prop); free(ua->comstr);
これでひたすらコンテキスト作って解放してを繰り返してもメモリが増えることは無くなったっぽい.はぁ,情けない・・・.でも,これで60MBもリークするのは相当至難の技な気も (かなりの回数バッファを作ったり消したりしないとだめだと思われる).まだ他にもあるのかなぁ・・・.
[コメントを書く]
2009年1月4日の日記の2番目の記事へのコメント
なぜこれを見逃したかはさっぱり理解できませんが…
素直に喜べないところですがw,とりあえずリークが塞がって
よかったよかった.
バグフィックス版なら早めに出してもいいんじゃないかと.
また見つかったらその時はその時で・・・