Pukiwikiで突如、ページが表示されなくなったと思ったらapacheのプロセスごと落ちていた。PHPのエラーログは出ていない。apacheのエラーログには単に以下のようなログだけ。 child pid 1118 exit signal Segmentation fault (11) レアケースだと思うが、結論としてはPukiwikiのソースをいじって解決。 PHP – Segmentation fault 原因不明のエラーをデバッグする方法 | 海は海、風は風 dozo.rgr.jp ここを参考にまずは原因究明。 gdbでrunすると Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1208199488 (LWP 585)] 0x0049b16f in pcre_dfa_exec () from /lib/libpcre.so.0 で止まった。btすると大量に行が出力されるが、途中、php_pcre_replaceなどとあるのでpreg_replace系に何やら問題があるらしい。 大方長過ぎる文字列を渡して正規表現がおかしくなっているんだろう、と思い、Pukiwikiのコード中に適当にdie("hoge")を入れて、セグフォする箇所を特定。 convert_html内で呼び出しているlib/make_link.phpのclass InlineConverterのconvertメソッドで使っているpreg_replace_callbackが原因と判明。 $string = preg_replace_callback('/' . $this->pattern . '/x', array(& $this, 'replace'), $string); ここで渡している$this->patternはずいぶんと複雑な正規表現(文字数にして2496文字!)で、$stringの方もそのときは35000文字もあったので、こりゃぁ落ちるな、という気がした。 とりあえず [...]
Recent Posts
Categories
Archives
- April 2011
- November 2010
- October 2010
- July 2010
- June 2010
- January 2010
- August 2009
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
- January 2009
- November 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006
- October 2006
- September 2006
- August 2006
- July 2006
- June 2006
- May 2006
- April 2006
- March 2006
- February 2006
- January 2006
- December 2005
- November 2005
- October 2005
- September 2005
- August 2005