namazu-dev(ring)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: memory leak on libnmz



knok@xxxxxxxxxxxxx (NOKUBI Takatsugu) wrote:

>>   Search-Namazu の方が一段落したので、memory leak の方をチェックするこ
>> とにしました。
>
>  今、phrase search での memory leak を調べています。どうも、
>
>* match する単語の pair が 1 つ以上存在する場合は leak しない
>* どの単語の pair も match しない場合は leak が起きる
>* leak は単語の数によらず一定 (malloc_hlist 1 回分の領域が free されな
>  い)

詳細な調査をありがとうございます。


>  という状況のようです。心当たりありませんでしょうか? > 高林さん

手元のマシンに ccmalloc をインストールして調べてみました。

  * ccmalloc 0.2.3
    <http://iseran.ira.uka.de/~armin/ccmalloc/>

ソースを展開して make を実行すると、

| gcc -c -O -g -Wall -fPIC -DUSE_DTOR_FOR_REPORTING ccmalloc.cc
| In file included from ccmalloc.cc:11:
| callchain.c: In function `void banner(...)':
| callchain.c:3044: assignment to `char *' from `const char *' discards qualifiers
| make[1]: *** [ccmalloc.o] Error 1
| make[1]: Leaving directory `/home/satoru/src/ccmalloc-0.2.3/src'
| make: *** [all] Error 2

なるエラーが起きたので src/callchain.c に次のパッチをあてて
解決しました。

  3040c3040,3041
  <   char * lfn, * date_str, * osinfo_str;
  ---
  >   const char * lfn;
  >   char * date_str, * osinfo_str;

で、

  % make LDFLAGS='-lccmalloc -ldl'

と実行して ccmalloc つきの namazu を作って、src/.libs ディレ
クトリで namazu コマンドを実行すると、 libintl.a をリンクし
ている関係で gettext 関係の leak が次のようにたくさん検出さ
れてしまいます。

# src/.libs で namazu コマンドを実行して実験したのだけど、方
# 法はこれで正しいのだろうか?

  * 37.3% = 1024 Bytes of garbage allocated in 1 allocation
  |       |
  (snip)
  |       |       0x080549c2 in <???>
  |       |                  at localealias.c:372
  |       |       0x08053f5c in <???>
  (snip)
  |       |                  at gettext.c:64
  |       |
  |       |       0x08053f44 in <???>
  |       |                  at dgettext.c:53


そこで、 ~/.ccmalloc

  dont-log-chain localealias.c
  dont-log-chain intl-compat.c
  dont-log-chain l10nflist.c
  dont-log-chain dcgettext.c

を追加すると、gettext関連の leak を無視できます。

# これとは別に ~/.ccmalloc に
#   set load-dynlibs 1
# を設定しておく必要があるようです。

で、次のようにヒットしないフレイズ検索をかけると

  % ./namazu '{gnu namazu}' ~/NMZ/Backup
  検索結果

  参考ヒット数:  {  [ gnu: 142 ]  [ namazu: 2223 ]  :: 0 } 

  検索式にマッチする文書はありませんでした。

ccmalloc は次のような報告をしてくれます。

  * 55.4% = 3408 Bytes of garbage allocated in 1 allocation
  |       |
  (snip)
  |       |       0x400165c4 in <do_phrase_search>
  |       |                  at search.c:409
  |       |
  |       |       0x400160de in <do_word_search>
  |       |                  at search.c:274
  |       |
  |       |       0x40014611 in <get_hlist>
  |       |                  at hlist.c:194
  |       |
  |       |       0x4001415a in <malloc_hlist>
  |       |                  at hlist.c:194
  |       |
  |       `-----> 0x0804dd6f in <malloc>
  |                          at wrapper.c:325
  |        
  `------------------------------------------------------

で、この情報を元にささっと修正して、 cvs commit。すばらしい。
ccmalloc はなんて便利な道具なのだ!!

p.s.
Namazu の開発を通じてたくさんの技術を学ばせてもらっています。
ほかでは得られない経験です。:-)

-- Satoru Takabayashi