From: "NAKAMURA, Hiroshi" Date: 2002-03-08T18:57:46+09:00 Subject: [ruby-dev:16287] Re: Rite debug API (was Re: No trace_func event at if-elsif-else line) なひです。 > From: Yukihiro Matsumoto [mailto:matz@ruby-lang.org] > Sent: Thursday, March 07, 2002 6:06 PM > |構文木レベルではdebug APIを用意せず、構文木→バイトコードを > |作った後のバイトコードの置き換えレベルでしかdebug APIを > |提供しない予定、ということでしょうか。 > > そんな感じですね。 > > |こないだなすらぐで咳さんと会った時に想像されるVM像を > |いろいろ聴いたんですが、できれば構文木の任意の場所に > |aBreakPointExceptionをraiseするノードを打ち込んで、 > |それを拾うのが楽でいいなぁ(rescueしたあとで > |resumeできないといけないんだけど!)。想定されるRiteの > |VMでは無理ですか? > > えーと、どう想像したのか分かりませんので、もうちょっと書いて > みていただけませんか? そうするとどう楽なんでしょう? あんまり考えずに発言したんですが(をい)、よく考えるに2点あって、 ひとつはdebug APIから構文木に触れる(たどる、取得する、 置き換える(*1))と、バイトコードしか触れないのに比べて、 現象調査のための情報を取得するのが楽、というものです。 もしRiteのdebug APIがbpのみでシングルステップ実行(*2)を サポートしないとしたら、次に行きそうなところを探して bp打たないといけません。もしバイトコードしか触れないと すると、そのためには、 - バイトコードから現在のソースコード上の位置を求める - ソースコード上で次に止めたいところを決める(*3) (次の行とか任意のメソッドの入り口とか) - ソースコードをコンパイルしてバイトコードにする - つき合わせて、対応する部分にbp みたいなことをやらないといけませんよね。 こりゃ面倒だなーと。 (*1) せいぜい例外発生ノードに置き換える程度。 咳さんが書いているような「書き換える」のはあまり考えてません。 最近の賢いデバガはコンパイル時間短縮のためにやるみたいですが、 Rubyでそれが必要になることは少なそう。 (*2) 次の行(next)もしくは任意のメソッドの入り口(step)で 止める。Rite VMがこれをやると「非デバッグ時の効率を 落とさない」という命題を守れなくなりそうなので、 提供されないかも、と推測。 (*3) ソースコードから、次に実行が遷移しそうな場所を 探すのはめんどくさそうだなー。完璧にはできそうにないし。 構文木を見ないと無理だろうなー。 もう一点はbpが例外であることの楽さなんですが、 Rite VMからdebug APIへ「debuggeeを調査させてあげるよ」 と教えるタイミングが - bpに来たとき - 例外発生時 と2種類にわかれてるより、1つにまとまってたほうがスマート、 くらいの意味です。手間が倍になるという話ではありません。 > |# Riteでは例外発生時にファイル名と行番号が > |# 表示されなくなったりして。。。by咳 > > それはないです。さすがに。 混乱させてますが、咳さんが本気でそう言った訳じゃないです。^^; すいません。 # 本気にされるなんて思わなかったんだよー > From: m_seki@mva.biglobe.ne.jp [mailto:m_seki@mva.biglobe.ne.jp] > Sent: Thursday, March 07, 2002 10:30 PM > > |構文木レベルではdebug APIを用意せず、構文木→バイトコードを > > |作った後のバイトコードの置き換えレベルでしかdebug APIを > > |提供しない予定、ということでしょうか。 > あれ?どこまでスクリプトレベルに解放されるんだろ。 > > たとえば、 > aVM.patch(filename, lineno, proc) > みたくできるとか… 基本的には、なひが↑で書いてるようなdebug APIは、 スクリプトレベルには開放されない(でかまわない)気がしてます。 デバッグ時にVM内にロードされてdebuggeeに取り付くモジュールは、 上記最低限のdebug APIを使ってbp、ステップ実行、 可能ならwatch point、後は情報の取得部分を実装し、 実際にIDEとかdebuggerを作る人はそいつと通信する (普通debug APIって言ったらこっちのこと指すかな?)ことに なるんじゃないかなー。で、こっちはスクリプトに開放される。 というのが現在の(ありがちな)イメージですが、例によって具体的な 実装イメージはさっぱりありません。 > でもRubyだから実行中にどんどんバイトコードが増えていくんだろうなあ‥ > どうなっちゃうんだろう。 evalの中身にbp打つのってどうやるんだろう。。。