2009年1月4日の日記を表示中

2009年 1月 4日 (日)

Pidgin for Windows

AIMで日本語でチャットするとクラッシュするという報告を頂いたので調べてみたのですがLinuxだと全然再現しません.あれーと思ってWindows版で試したらあっさり再現.ソースを追ってみたら,Windows版に限り未初期化のポインタをfreeするようなコードになってました (;´Д`).何か 2.5.1 → 2.5.2 の間でのパッチのマージミスっぽいな・・・.ていうかこちらのテスト不足ですね.すいません・・・.

というわけでこの問題を修正したバイナリを置きましたよ.必要な方はこちらからどうぞ.ちなみに yaz さんによると mtn が悪いらしいです(笑)

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もリークするのは相当至難の技な気も (かなりの回数バッファを作ったり消したりしないとだめだと思われる).まだ他にもあるのかなぁ・・・.

[コメントを書く]

ekato 2009/01/06(火) 14:50:50
久しぶりにみてみたら、実際 uim-skk が盛大にリークしてました。
なぜこれを見逃したかはさっぱり理解できませんが…
ekato 2009/01/06(火) 15:21:17
コミットしておきました。それにしても次のリリースどうしましょうかね…
nosuke 2009/01/06(火) 22:01:37
おお,uim-skkにもありましたか!
素直に喜べないところですがw,とりあえずリークが塞がって
よかったよかった.
バグフィックス版なら早めに出してもいいんじゃないかと.
また見つかったらその時はその時で・・・
ekato 2009/01/07(水) 13:17:58
uim-0.0.5 という、いにしえの物からずっと同じ場所でリークしてたみたいですよ! 1.5.5 来週あたりにでもリリースします。
nosuke 2009/01/07(水) 21:30:56
0.0.5って2003年頃ですか.すげえ・・・

2009年1月4日の日記を表示中

中の人情報

名前:
nosuke (のすけ)
メール:
sasugaanijaのgmail.com
「の」は「@」みたいな
関連リンク:

カレンダー

2009年1月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

<<先月分

翌月分>>

最新の10件のエントリ

最近の10件のコメント

過去ログ