3

私は今ruby-debuggemを学ぼうとしていますが、追いつけない専門用語がたくさんあります。誰かが説明を手伝ってくれるかどうか疑問に思いますか?

http://bashdb.sourceforge.net/ruby-debug.htmlでも見つかりませんでした。著者は、私たちがすでにそれらを理解していると仮定しました(とにかくどこでそれらについて学ぶことができますか?)。

たとえば、help frameこれはrdbを呼び出した結果です。太字の項目が全部わからない。

現在のフレームを指定したフレーム番号に移動します。

負の数は、もう一方の端からの位置を示します。したがって、「フレーム-1」は最も古いフレームに移動し、「フレーム0」は最も新しいフレームに移動します。

引数がない場合、コマンドは現在のスタックフレームを出力します。現在位置が再表示されるため、フロントエンドも監視している場合は再同期が発生する場合があります。

スレッド番号が指定されている場合、式を評価するためのコンテキストその スレッドのそのフレームに設定します。

4

2 に答える 2

5

これは Ruby 固有の専門用語ではありません。ほとんどすべてのデバッグに共通です。

スタックフレームについて

おそらくスタック トレースを見たことがあるでしょう。

/usr/local/rvm/gems/ree-1.8.7-2010.02/gems/redgreen-1.2.2/lib/redgreen.rb:28:in `write': Broken pipe (Errno::EPIPE)
from /usr/local/rvm/gems/ree-1.8.7-2010.02/gems/redgreen-1.2.2/lib/redgreen.rb:28:in `output_single'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:72:in `add_fault'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/ui/console/testrunner.rb:70:in `to_proc'
from /usr/local/rvm/rubies/ree-1.8.7-2010.02/lib/ruby/1.8/test/unit/util/observable.rb:78:in `call'

完全なトレースは、「コール スタック」を示しています。一番上の行は例外がスローされた場所であり、その下の行は、プログラムがそのポイントに到達するためにたどったコードのパスを示しています。これらの各行は、「スタック フレーム」と呼ばれるスタック内のレベルです。したがって、例外がスローされると、現在のスタック フレームがスタックの一番上になります。に移動する場合frame -1次に、コール スタックの一番下に移動します。コール スタックは、プレートのスタックのようなものと考えてください。関数を呼び出すとスタックにプレートが追加され、その関数から戻るとスタックからプレートが削除されます。各プレートはフレームです。通常、関数内の関数内で関数を呼び出すことになるため、呼び出しスタックがかなり深くなり、呼び出しスタックの各ポイントでローカル変数と状態を評価するために、それらを上下に移動することがデバッグに役立ちます。

コール スタックについて詳しく知りたい場合は、ウィキペディアにすばらしい記事があります。

スレッドについて

最新のプログラミング言語のほとんどはマルチスレッドです。つまり、複数のコード パスを (ほぼ) 同時に実行できます。たとえば、ビジュアル アプリがあり、高価な計算を実行するとします。計算の実行中、GUI はユーザー入力に反応できず、ユーザーにはアプリケーションがフリーズしているように見えます。これを解決するには、2 つのスレッドを実行します。一方のスレッドはユーザー入力の受け入れと処理、および GUI の描画を担当し、もう一方のスレッドは負荷の高い計算を担当します。計算スレッドが負荷の高いループに陥り、GUI スレッドが実行され続けて GUI が描画され続ける可能性があります。

マルチスレッド アプリケーションを実行している場合、デバッグ コマンド (式) を評価するスレッドを選択する必要があります。これは、各スレッドがコードの異なるポイントにあり、異なるコール スタックと異なるコール スタックを持つためです。ローカル変数と状態など。これが評価コンテキストです。

ただし、これは Rails に関する質問であり、Rails は (デフォルトで) シングルスレッドであるため、スレッドについて心配する必要はありません。

于 2010-08-28T09:43:52.357 に答える
1

Chris Heald は本当に素晴らしい答えをくれました。いくつかの非常に小さなコメント。Ruby Rails はシングルスレッド (デフォルト) ですが、Ruby/Rails を実行する Web サーバーの種類によっては、プログラム全体 (Web サーバー + Ruby/Rails) がシングルスレッドでなくなる場合があります。

コメント:

現在位置が再表示されるため、監視しているフロント エンドが存在する場合、再同期がトリガーされる可能性があります。

出力内のソース コードの位置を探して出力を解析するデバッグ フロント エンドがいくつかあります。これにより、フロント (テキスト エディター GNU/Emacs など) が現在の場所を示すことができます。(GNU/Emacs の場合、これは別のエディター ウィンドウに表示されます。) 別のフレームに変更すると、そのフロントは現在の位置を示す表示を更新する必要があります。

これは Emacs と古いデバッガーのフロント エンド ddd の場合であることはわかっていますが、vim からデバッグしている場合も同じことが起こっていると思います。

于 2010-08-28T18:27:01.167 に答える