How to stop the Rails debugger for the current request

后端 未结 9 1364
既然无缘
既然无缘 2021-02-02 15:50

Say I have a loop in my code that calls the rails debugger a few times

def show
    animals = [\'dog\', \'cat\', \'owl\', \'tiger\']
    for animal in animals
           


        
9条回答
  •  深忆病人
    2021-02-02 16:31

    It looks like in the source of ruby-debug, the call to debugger will always stop execution whenever it is hit. So one solution is to do as was suggested by Mori in his 'ad-hoc' solution, to make a conditional around the call to debugger that you can tweak inside the debugger session itself, such that you avoid calling debugger. This is probably the neatest solution, and what I would do unless you have some strong nagging purity issues with the code involved.

    If you really want to only do this without some external conditional and inside the debugger session itself, it is possible. What you have to do is set a breakpoint in the code itself, then you can delete that breakpoint in the debugger when it is triggered:

    require 'rubygems'
    require 'ruby-debug'
    
    Debugger.start
    Debugger.add_breakpoint(__FILE__, __LINE__ + 2)
    while true do
      puts "Hi"
      puts "mom"
    end
    Debugger.stop
    

    This produces this sort of interaction:

    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
    

    ...and so on.

    In this way, you are setting the breakpoint in code, then deleting it when you are done. Note that any time the line Debugger.add_breakpoint is called, it will re-set the breakpoint, so that's why it is outside of the loop and pointing 2 lines down. This technique can easily be extracted to require-ing a script that sets the breakpoint only when loading your server - Heck, you could write a whole framework class around controlling the Debugger module however you want. Of course, if you went this far, I would just create a singleton class that helps you implement Mori's ad-hoc solution and does or does-not call the debugger statement.

提交回复
热议问题