首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Byebug断点设置与连续故障

Byebug断点设置与连续故障
EN

Stack Overflow用户
提问于 2016-03-17 11:45:34
回答 1查看 1.1K关注 0票数 1

我正在尝试学习Byebug,并遵循(https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md),并且我被困在设置断点之后继续设置断点。在为第5行设置断点并运行“继续”之后,Byebug退出会话。有人能看出我做错了什么吗?

代码语言:javascript
复制
    $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 

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

代码语言:javascript
复制
[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
$
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-17 12:56:39

您打算在这里使用next吗?continue是同一个control+d,将继续运行您的代码,直到到达另一个断点或代码结束为止。

我想,当您输入“继续”时,脚本的其余部分运行,程序退出,因为没有另一个断点。

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

编辑

从您给出的附加信息来看,这似乎实际上是预期的行为。以下是您需要了解的关于断点的内容:

他们不会跟随向下的幅度变化。例如,假设我编写了这样的方法:

代码语言:javascript
复制
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这样简单的内容。

顺便说一句,据我所知,所有这些范围的东西都适用于窥探。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36059628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档