開発日記/2010-04-26

やっとメモリリークの原因が分かった。

  • error_log
    *** glibc detected *** /usr/bin/php-cgi: double free or corruption (!prev): 0x0000000003305eb0 ***
  • access_log
    302 66.249.68.152 - - [26/Apr/2010:10:18:37 +0900] "GET /modules/popnupblog/?xoops_session=658425spb3kgl6srt3u7l6sl73 HTTP/1.1" 500 400 "-" "SAMSUNG-SGH-E250/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Browser/6.2.3.3.c.1.101 (GUI) MMP/2.0 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)"
  • 発生理由

popnupblogに携帯からアクセスするとダメらしい。。。 (^^;

wizmobileとpopnupblogだとダメみらいですね。^^;

wizmobileでpopnupblogをアクセス除外にすると、発生しなくなりました。

  • 別な解決方法

環境変数、MALLOC_CHECK_を設定しておくと、とりあえず耐えるらしい。
でもabortしないから、ずっと溜まっていて負荷によるアクセス不能になるのがいままでの原因だったようです。

このMALLOC_CHECK_の値を2とか3にしておくと、「二重解放; double free」した時点でabortしてくれる。
※Apacheはダウンするかもしれないけど、アクセス不可にはならない。

export MALLOC_CHECK_ = 2

一応次回は同じような事にならないように、abortするように「MALLOC_CHECK_ = 3」で設定しておきました。 (^-^

※MALLOC_CHECK_の設定値

0エラーメッセージを生成しない、プログラムを強制終了しない。
1エラーメッセージを生成するがプログラムは強制終了しない。
2エラーメッセージは生成しないがプログラムを強制終了する。
3エラーメッセージを生成してプログラムを強制終了する。

設定方法

通常のphp(php cli)を使っている場合は、

httpd.conf に下記を追加
SetEnv MALLOC_CHECK_ 2

suphpで動作させている場合は、下記のようにヴァーチャルホストごとに設定する。

<VirtualHost *:80>
    SetEnv MALLOC_CHECK_ 2
</VirtualHost>