PRagger crash とその後
実際に PRagger がクラッシュするわけではないですけれど、
プラグインを開発していたり、野良プラグインを入れてみたときに、
設定の間違いや何かで、exception が発生することがあります。
そのときに、data がどんなデータを持っていたかを知っていると
デバッグしやすいかな、と思い、PRagger のプラグイン実行中に
exceptin が発生が発生すると、そのプラグインに渡した data の
内容を YAML に出力するというパッチを作ってみました。
出力するファイル名はフォーマット固定にしています。
core_[モジュール名].[PID] です。
この機能は、YAML::load と YAML::save を突っ込めばできるんだけれども、
起きてからはでは遅いし、exception が発生する時ってのは、
たまたまデバッグコードを外したときだったりすることが多いからね。
*** pragger.rb.org Sun Oct 14 01:29:39 2007 --- pragger.rb Sun Mar 09 23:38:41 2008 *************** *** 24,31 **** def eval_pragger(command_array,data) command_array.inject(data) do |data, command| ! puts "exec plugin #{command["module"]}" ! $plugins[command["module"]].send(command["module"].sub(/.*::/,""), command["config"] || {}, data.dup) end end --- 24,41 ---- def eval_pragger(command_array,data) command_array.inject(data) do |data, command| ! begin ! puts "exec plugin #{command["module"]}" ! $plugins[command["module"]].send(command["module"].sub(/.*::/,""), command["config"] || {}, data.dup) ! rescue Exception => e ! File.open('core_' + command["module"].sub(/.*::/,"_") + '.' + $$.to_s, "w") do |f| ! YAML.dump(data, f) ! end ! bt = e.backtrace ! puts "#{bt.shift}: #{e.message} (#{e.class})" ! print bt.map{|s| "\tfrom #{s}"}.join("\n") ! break ! end end end