我正在尝试学习Byebug,并遵循(https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md),并且我被困在设置断点之后继续设置断点。在为第5行设置断点并运行“继续”之后,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
$发布于 2016-03-17 12:56:39
您打算在这里使用next吗?continue是同一个control+d,将继续运行您的代码,直到到达另一个断点或代码结束为止。
我想,当您输入“继续”时,脚本的其余部分运行,程序退出,因为没有另一个断点。
顺便说一下,这可能是值得尝试的撬宝石,而不是byebug。与byebug不同,复制粘贴多行代码在pry中工作,还有许多其他有用的功能,如源代码浏览和语法突出显示。虽然它没有附带“next”或“next”,但您可以安装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的语法糖,它们是匿名函数,因此引入了范围更改。我不确定确切的原因,但进入一个方法体也需要向下的范围改变。
因此,当您按下next时,实际发生的情况是,它移动到puts "my method is done"调用。虽然byebug关键字在方法中,但是返回到方法调用者的作用域是一个“向上”的范围更改,并且是预期的。再次键入next将移到puts "my program will end now"行。再次输入它将到达代码的末尾并退出程序。
如果需要在循环中的每次迭代中暂停,可以将断点放在循环块内,即5.times { byebug }。
为了让它回到您的示例--当您使用byebug可执行文件(即byebug myprogram.rb)调用脚本时,初始作用域是顶级的。键入next将跳过任何函数或循环。我不认为这对于非常小的程序是实用的,所以最好将byebug关键字放在代码中,用ruby可执行文件调用程序,即ruby myprogram.rb。
这是一个很小的细节,但是当断点是程序中的最后一行时,断点就会被忽略。为了防止这种情况,可以在断点之后放置任何内容,即使是像exit这样简单的内容。
顺便说一句,据我所知,所有这些范围的东西都适用于窥探。
https://stackoverflow.com/questions/36059628
复制相似问题