XML::Simpleを使ったら…とんでもないことにっ!!

※あとでまとめる

なんか、、、ドエライことになってしまった。
まず、[XML::Simple]を使って、xmlファイルを解析するプログラムを作ったわけです。
そしたらば、、、
XML::Simpleでメモリリークを起こしてることが判明。

犯人は誰だ!?

どうやらXML::Simpleは、パースするモジュールをいくつか指定できるみたいで。
特に何も指定してやらなければ、XML::LibXML::SAXってのが指定されるのです。
で、このXML::LibXMLのバージョン1.59ではメモリリークの箇所がfixされているのですが、、、
あいにく、現在開発中の環境では1.58だったわけで、、、

犯人はこいつかっ!!
http://search.cpan.org/src/PAJAS/XML-LibXML-1.59/Changes

で、さて。次にやってみたのが、パースするモジュールをXML::Parserに指定してみたわけです。
XML::Simpleを呼び出す前に
local $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
と一行書くだけで指定完了!
コマンドで実行。
よし、データはちゃんと取得されてる!無事成功!
と、思いきや。
意外な落とし穴が、、、

ApacheXML::Parserがexpatライブラリをリンクしてしまう為、
mod_perl下では1つのApacheに2つのexpatがリンクされることになり、
セグメンテーション例外を起こし「segmentation fault」で異常終了する。
解決策は、、、

なんかApacheコンパイルするとき「expat」を無効にする
[--disable-rule=EXPATオプションを指定する]
とうまくいく!?らしい。。。
うまくいくのか!?
どうなの!?
そこまでは試してない、、、
それに実はまだexpatが何者なのかもよく分かっていません。。。

ああ、世の中分からないことだらけだわ、、、orz

[キーワード]
Apache
expat
衝突
local $XML::Simple::PREFERRED_PARSER = 'XML::Parser';
Apacheが「segmentation fault」で異常終了する
child pid xxxx exit signal Segmentation fault (11)のApacheエラーログ

参考URL
YappoLogs: mod_perlにてApache::XMLRPC::Lite(SOAP::Lite(XML::Parser))を使う為には
http://search.cpan.org/src/PAJAS/XML-LibXML-1.59/Changes
http://asp.nishinari.or.jp/faq.html#Apache%20Expat3f8589db
>EPrints 2.3技術文書 - 問題解決法
浅倉@三日坊主の別館:ようやく理由が分かりました - livedoor Blog(ブログ)
http://mfpm.blogdb.jp/app/view/XML::Parser/