結論から言うと、Segmentation fault(11)は治らなかった。
とにかく、どうにもcore吐いてくれない事には始まらない。
という訳で、ググる。
カーネルの設定を変えてやればいいらしい。
sysctl kern.sugid_coredump
kern.sugid_coredump: 0
sysctl kern.sugid_coredump=1
kern.sugid_coredump: 0 -> 1
sysctl kern.corefile=/var/tmp/%N.%U.core
kern.corefile: %N.core -> /var/tmp/%N.%U.core
Apache は wwwにユーザー変えてるので、kern.sugid_coredump を 1に変えてあげないといけないと言うことらしい。
core吐く場所は、 CoreDumpDirectory ディレクティブで設定できる。
で、吐きました。
適当にぐぐってgdbで眺めてみると、
2chのどっかのスレのURLとsed_response_filter の文字が。
どうみても、mod_sedな関数名と、どう見ても、臨時用2ch串のアクセスっぽいURL。
試しに、そのスレのhtmlをローカルに落とし、そのhtmlに臨時用2ch串と同じ
mod_sed のディレクティブを書いてアクセスしてやる。
結果、再現率100%で落ちる事を確認。
吐かせたcoreも同じ箇所で落ちてることを示している。
つまり、ある特定のスレにアクセスすると、必ず反応がなくなる。
そういや、mod_sedはExperimental(実験的)モジュールの扱いだったなぁ……
と、今さらながらに思い出す。
けれど、mod_sedみたいな面倒くさいモジュールのソースを追う気は無い。
正確には、眺めてみたけどこれは手に負えそうにない。
なんとかならんもんかと、2.4の新機能を眺めて、あれこれググる。
どうも、mod_proxy_htmlにリンクを書き換えてくれる機能があるらしいのだけれど、
リンク以外にJavaScript追加してる所も有るので、こっちは使えない。
mod_ext_filterに戻るのはなんだか負けた気がする。
いや、別に勝負ではないんだけれど。
で、mod_sed つながりで、mod_substitute なんてのがあることを知り、
試してみると、これがいい感じに動いてくれる。
mod_substituteのステータスはExperimental(実験的)では無いので、落ちることもなかろう。
という訳で、こんなディレクティブを書いた。
これで、また様子をみることにする。
コメントを残す