Rubyが例外を吐いて終了する際に、例外発生時点の環境で自動でREPLが起動するようになっていればデバッグ楽だよなぁと思っていたのだけど、 1つ実装方法をひらめいたのでライブラリを作ってみた。
これを使うと以下のようなことが出来るようになる。
$ ruby -rdebug-exception -e ' def f(i) raise "test" end f(0) ' RuntimeError: test from -e:3:in `f' from -e:6:in `<main>' irb#1(main):001:0> i => 0
debug.rbやruby-debugと比較したときのこのライブラリのメリットは以下の2点*1。
ただ、今のRubyはデバッグ用に使えるAPIがあまり整備されていないのでこの実装も機能制限付きな部分がある。 (例えばinitializeを再定義しているようなユーザ定義例外クラスを使うとうまく動かない)
2012/04までにこのあたりを何とかするという話も出ているので、 それにあわせてもう少しまともに作っておくと便利かな。
どういう機能がほしいかあげてもらえると助かります。
この機能に必要なものに絞って話をすると、[ruby-dev:44024]他で議論されているAPIがあればよさそうです。 <br>ある程度汎用的にするにはcfpを返すAPIとcfpからbindingを生成するAPIに分けた方が良いかもしれません。(ruby-debugの実装を見ていないので適当なことを言っているかも) <br> <br>また、今の実装で気になっている点として「StandardError#initialize中のrb_binding_new呼び出しで例外が起きるとスタックを食いつぶしてしまう可能性がある」「トップレベルまで伝播した例外をat_exitで扱うことの是非」があるのですが、Rubyのコア機能としてこれらのケアが必要かどうかはまだ判断できていません。 <br>単に実装がまずいだけのような気もします。 <br>
む、今更気づいたけどこのアプローチだと例外の生成とraiseを全く無関係の場所で行ってしまうと対応できないな。