tokuhirom@株主の日記 このページをアンテナに追加 RSSフィード

2011-08-31

Xslate が SEGV したときにどうすればいいか 13:20 Xslate が SEGV したときにどうすればいいか - tokuhirom@株主の日記 を含むブックマーク

まず基礎知識として、Perl で webapp をかいている場合 SEGV する原因は

  • XSのバグ(80%)
  • 環境設定の問題(10%)
  • deep recursion で stack をつかいつくすなどの既知バグ(2%)
  • out of memory 系(1%)
  • Perl 本体のバグ(4%)

といったところです。(本体のバグについてはPerl 5.8 ではバグっていても 5.14 などではすでに修正されているバグも多いかとおもいます)。

というわけで、テンプレートエンジンがSEGVする場合のうち、90% はテンプレートエンジン自体の問題ではありません。そこでまずは SEGV する原因をしらべるわけですが、SEGV する原因をしらべるには、gdb をつかうのが簡単です。

% gdb --args perl `which plackup` app.psgi

などとして起動してから実際に SEGV をおとし、gdb がとまったところですかさず 'bt' コマンドをうちます(bt=backtrace)。この時、C レベルのスタックトレースがとれますが、このときに表示されているスタックトレースのログの一番上の方にのこっている部分に注目します。

今回の場合は Xslate の stacktrace ばかりが表示されていたので、あきらかに問題は xslate でした。他の XS モジュールの名前があらわれていた場合には xslate 以外が原因ですので、そちらをおってください。

問題があきらかになったらあとはコードをけずっていきます。base class の中身を問題の部分にむけてひきあげるとかそういうのを地道にやっていってどんどんコードをけずります。

最小のケースができあがったらあとは作者のふジゴロウにおくりつければそのうちなおります。

(このエントリー、途中でかいてるうちにめんどくさくなってしまいました)