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