Byebug断点设置和延续故障

时间:2016-03-17 11:45:34

标签: ruby-on-rails ruby

我正在尝试学习Byebug并且正在跟随(https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md)并且我在设置断点时遇到困难并在断点设置后继续。在我为第5行设置断点并运行continue之后,Byebug退出会话。有人能看出我做错了吗?

    $byebug hanoi.rb 

        [1, 10] in /Users/jackburum/ruby/byebug-testing/hanoi.rb
            1: #
            2: #
            3: #
        =>  4: def hanoi(n, a, b, c)
            5:   hanoi(n - 1, a, c, b) if n - 1 > 0
            6: 
            7:   puts "Move disk #{a} to #{b}"
            8: 
            9:   hanoi(n - 1, c, b, a) if n - 1 > 0
           10: end
        (byebug) break 5
        Successfully created breakpoint with id 1
        (byebug) continue
 $byebug hanoi.rb 

如果我运行下一个命令而不是继续,则会出现同样的问题......

[1, 10] in /Users/jackburum/ruby/byebug-testing/triangle.rb
=>  1: def triangle(n)
    2:   tri = 0
    3: 
    4:   0.upto(n) { |i| tri += i }
    5: 
    6:   tri
    7: end
    8: 
    9: # if __FILE__ == $triangle.rb
   10: #   t = triangle(3)
(byebug) break 2
Successfully created breakpoint with id 1
(byebug) next
$

1 个答案:

答案 0 :(得分:0)

你想在这里使用next吗? continue是相同的控件+ d,并将继续运行您的代码,直到达到另一个断点或代码结束。

我认为当你输入continue时,你的脚本的其余部分会运行并且程序会退出,因为没有另一个断点。

顺便说一下,尝试使用pry gem而不是byebug可能是值得的。与byebug不同,复制粘贴多行代码在pry中工作,还有许多其他有用的功能,如源代码浏览和语法突出显示。虽然它没有“下一个”或“继续”出框,但您可以安装pry-byebug gem来获取这些内容。

修改

根据您提供的其他信息,这似乎实际上是此处的预期行为。以下是您需要了解的断点:

他们不会遵循向下的范围变化。例如,假设我写了一个这样的方法:

def my_method
  puts "my method started"
  byebug
  5.times { "do something in a loop" }
end
my_method()
puts "my method is done"
puts "the program will end now"

使用ruby myfile.rb运行代码时,代码在暂停断点之前进入第6行。由于断点位于方法体内,因此在实际调用该方法之前不会激活它。

如果您输入next会怎样?您需要输入5次才能通过5.times {}循环吗?答案是否定的,这是因为迭代器有一个向下的范围变化。在Javascript中,这个“范围更改”更加清晰,因为您使用function关键字来显示匿名函数(因此更改范围)。但在Ruby中,块实际上是Procs的语法糖,它们是匿名函数,因此引入了范围更改。我不确定确切的原因,但进入方法体也需要向下调整范围。

因此,当您按下一步时,实际发生的是它会转移到puts "my method is done"来电。尽管byebug关键字位于方法内部,但要返回方法调用方的范围是“向上”范围更改并且是预期的。再次键入将移至puts "my program will end now"行。再次键入它将到达代码的末尾并退出程序。

如果需要在循环中的每次迭代中暂停,可以将断点放在循环块中,即5.times { byebug }

将它带回到您的示例中 - 当您使用byebug可执行文件(即byebug myprogram.rb)调用脚本时,初始范围是顶级的。键入next将跳过任何函数或循环。除了非常小的程序之外,我不认为这是实用的,所以最好将byebug关键字放在代码中,然后使用ruby可执行文件调用程序,即ruby myprogram.rb

这是一个小细节,但当它们是程序的最后一行时会忽略断点。为了防止这种情况,请在断点之后放置任何内容,甚至是exit之类的简单内容。

顺便说一句,就我所知,所有这些范围的东西也适用于撬。