15

Railsデバッガーを数回呼び出すループがコードにあるとします

def show
    animals = ['dog', 'cat', 'owl', 'tiger']
    for animal in animals
    debugger
    # do something else
end

オプションを指定してサーバーを起動したとすると--debugger、このページが表示されると、ループが実行されるたびにデバッガーが停止します。

cont停止するたびに入力できるので、リクエストは続行されますが、特にこの例のように 4 回表示されることについて話していない場合は面倒ですが、400 回です。デバッガーを毎回一時停止せずに続行させる方法はありますかループのポイント?

私の現在の回避策はサーバーを再起動することですが、それには時間がかかります。

4

9 に答える 9

16

デバッガーステートメントに条件を付けて、必要なときにのみ停止するようにします。たとえば、次のようになります。

debugger if animal == 'tiger'

または、たとえば、ループ 384 でのみコードを調べたい場合は、次のようにします。

animals.each_with_index do |animal, i|
  debugger if i == 384
  # do something
end

または、アドホックに続行できる変数を入れます。

continue_debugger = false
animals.each do |animal|
  debugger unless continue_debugger
  # in the debugger type `p continue_debugger = true` then `c` when done
end
于 2011-05-31T12:09:33.277 に答える
12

反復の前にステートメントを配置debuggerし、反復内にブレークポイントを設定して、後でクリアできるようにします。

例:

def index

  debugger

  @things = Thing.all
  @things.each do |thing|
    # ... something you want to check out in the debugger
    thing.some_calculation
  end
end

デバッガに入ったら、内部にブレークポイントを設定します。

b app/controllers/things_controller.rb:42

(上記のように、42 は改行したい行番号ですthing.some_calculation。実行可能なコード行でなければならないことに注意してください -- コメント、空白行は機能しません)。デバッガーは、ブレークポイントの番号と場所を表示します。

Breakpoint 1 at .../app/controllers/things_controller.rb:42

これで、続行するたびにブレークポイントで停止します。完了してリクエストを完了したい場合は、ブレークポイントを削除します。

delete 1

もう一度続けると、リクエストが完了します。

于 2011-06-16T20:20:10.533 に答える
5

ruby-debugのソースでは、への呼び出しは、ヒットするたびに常に実行を停止debuggerするように見えます。したがって、1つの解決策は、Moriが「アドホック」ソリューションで提案したように、デバッガーセッション自体の内部で微調整できるデバッガーの呼び出しを条件として、を呼び出さないようにすることですdebugger。これはおそらく最も適切な解決策であり、関連するコードに強いしつこい純度の問題がない限り、私が行うことです。

外部条件なしでデバッガセッション自体の内部でのみこれを実行したい場合は、それ可能です。コード自体にブレークポイントを設定する必要があります。その後、トリガーされたときにデバッガーでそのブレークポイントを削除できます。

require 'rubygems'
require 'ruby-debug'

Debugger.start
Debugger.add_breakpoint(__FILE__, __LINE__ + 2)
while true do
  puts "Hi"
  puts "mom"
end
Debugger.stop

これにより、この種の相互作用が発生します。

Breakpoint 1 at debug_test.rb:10
debug_test.rb:10
puts "Hi"
(rdb:1) c
Hi
mom
Breakpoint 1 at debug_test.rb:10
debug_test.rb:10
puts "Hi"
(rdb:1) c
Hi
mom
Breakpoint 1 at debug_test.rb:10
debug_test.rb:10
puts "Hi"
(rdb:1) info b
Num Enb What
  1 y   at ./debug_test.rb:10
        breakpoint already hit 3 times
(rdb:1) del 1
(rdb:1) c
Hi
mom
Hi
mom
Hi
mom

...等々。

このようにして、コードにブレークポイントを設定し、完了したらそれを削除します。この行Debugger.add_breakpointが呼び出されると、ブレークポイントがリセットされるため、ループの外側にあり、2行下を向いていることに注意してください。この手法は、サーバーのロード時にのみブレークポイントを設定するスクリプトに簡単に抽出できますrequire。つまり、デバッガーモジュールの制御を中心にフレームワーククラス全体を記述できます。もちろん、ここまで進んだら、Moriのアドホックソリューションを実装するのに役立つシングルトンクラスを作成し、デバッガーステートメントを呼び出すかどうかを決定します。

于 2011-06-17T02:17:02.960 に答える
1

私は今日、これに対する別の答えを思いつきました。

debugger unless @no_debug

デバッガーが停止するすべての行でそれを使用します。停止を停止したい場合は、 @no_debug を何かに設定してください。

于 2012-04-29T23:21:26.467 に答える
0

これに対する別の答えがあり@debugます。デバッグするクラスにを設定します。そうすれば、次のことができます。

  if (@debug && (the_condition)) then debugger end

また

  debugger unless !@debug 

次に、デバッガーを使い終わったら、@debug = falsec

ただし、ライブコードにデバッガーの「ハードストップ」があることに本当に満足していません。これらは、誤ってチェックインして、何かが壊れるまで忘れてしまうようなものです。確かにそれ@debugに該当します。そのために、私の理想的な解決策は、マットのアイデアと、オブジェクトの作成時にオブジェクト内にブレークポイントを設定するスクリプトを使用することだと思います。そうすれば、必要なデバッグを行うことができますが、開発専用のコードをソース管理に含めることはできません。そのような解決策を見つけたら、この回答を更新します。

于 2012-01-21T16:43:02.790 に答える
0

debuggerコードからの呼び出しをいつでもコメントアウトしてからreload、デバッグセッションを入力できます。その後、cont一度だけ実行すると、デバッグセッションをトリガーせずに要求が続行されます。

開発モードになっているため、後でコールバックを追加するだけで、debugger正しくトリガーされます。

于 2012-08-10T21:55:17.660 に答える
0

この質問が私自身の検索で最初に表示されたので、これを代替としてここに入れます。特定の状況下では機能しないが、それ以外の場合は機能するコードがあり、これを実行する多数のテストがあるが、1 つの特定のテストが失敗したとします。continue本当にデバッグしたいテストに到達するまで、デバッグ コンソールに入力し続けなければならないのは PITAです。そのため、次の規則を使い始めました。

あなたのコードで:

def some_common_function
  debugger if defined? ::ASDF
  # do something
end

次に、テストで:

should "do this thing that it isn't doing under a specific circumstance" do
  # setup the specific situation
  ::ASDF = true
  # your tests
end
于 2014-05-27T18:56:11.610 に答える