

Byebug是Ruby的多合一调试实用程序。 它可以让您:
1.在任何代码段的任何地方停止执行,以查看周围情况
2.查看通往您所在位置的所有代码的完整回溯(包括任何框架代码)
3.浏览,进入并继续进行任何其他代码调用。
- 您最喜欢的说唱歌手适应了新经济,您也应该这样做吗?
- 时间跟踪软件-最好的时间表和预算跟踪工具
- Begini Cara Terorganisir Sejak dalam Pikiran
- 关于放松任务
- 星期一例行活动:Upguard联合首席执行官Mike Baukes
好处是立竿见影的。 如果没有大规模全面的测试套件的优势,当您观察一段代码的行为时,您可能至少(一次)说过“到底发生了什么?”。 Byebug有助于解决这个谜。
有几种使用byebug的方法,但是我们将演示最简单和最常见的情况:在代码行中的某个地方放一个byebug ,以查看发生了什么。
假设我们正在测试一个新的阶乘函数,并以fac(4)打印12的示例测试用例为例。 让我们看看我们为此设置了什么代码(希望您能够很快在这里发现该错误):
def fac(数字)
如果num <= 2
1个
其他
num * fac(数字-1)
结束
结束
放置(fac(4))
与其依靠我们的能力来手工读出这一点并得出有关错误的结论, byebug让我们在此函数的顶部放一个byebug ,然后看看我们在每个步骤中得到了什么……
需要“ byebug” def fac(num)
拜拜
如果num <= 2
1个
其他
num * fac(数字-1)
结束
结束
放置(fac(4))
一旦程序开始运行,我们将了解幕后情况。 首先通过检查num是什么(确保我们看不到任何时髦的值),然后检查断点在哪里的回溯:
matthewk @ matthewk-bonanza〜$ ruby fac_example.rb [1,10]在/home/matthewk/fac_example.rb中
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 2
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(byebug)num
4
(byebug)回溯
->#home / matthewk / fac_example.rb中的#0 Object.fac(num#Integer):5
#1 在/home/matthewk/fac_example.rb:12
到目前为止,什么都没有。 我们将单击“ next以进一步浏览代码,然后最终step看看执行递归fac调用时发生了什么……
/home/matthewk/fac_example.rb中的[3,12]
3:def fac(num)
4:再见
5:如果num <= 2
6:1
7:其他
=> 8:num * fac(num-1)
9:结束
10:结束
11:
12:看跌期权(fac(4))
(byebug)步骤
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
=> 4:再见
5:如果num <= 2
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(byebug)num
3
仍然看起来还不错,而且这个数字下降了一个,正如我们所期望的那样……所以让我们继续吧。
(byebug)/home/matthewk/fac_example.rb中的next [1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 2
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(再见)接下来
/home/matthewk/fac_example.rb中的[3,12]
3:def fac(num)
4:再见
5:如果num <= 2
6:1
7:其他
=> 8:num * fac(num-1)
9:结束
10:结束
11:
12:看跌期权(fac(4))
(byebug)步骤
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
=> 4:再见
5:如果num <= 2
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
看起来还不错。 我们只需要验证我们是否获得了期望的数字(2),并且回溯就可以了。
(byebug)num
2
(byebug)回溯
-> /home/matthewk/fac_example.rb中的#0 Object.fac(num#Integer):4
/home/matthewk/fac_example.rb中的#1 Object.fac(num#Integer):8
#2 Object.fac(num#Integer)位于/home/matthewk/fac_example.rb:8
#3 在/home/matthewk/fac_example.rb:12
看起来数字是正确的,并且我们有所有的递归调用。 让我们继续:
(byebug)/home/matthewk/fac_example.rb中的next [1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 2
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(再见)接下来
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
5:如果num <= 2
=> 6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
等一下。
此时,您应该注意到进入该分支(当数字为2时返回1 )似乎是错误的。 当我们查看该if语句时,我们发现数字2不是放置在此处的正确数字-它是1。因此我们将其替换为1,重新运行程序,一切都很好。
Byebug为我们提供的一件整洁的事情是,按回车键会重复最后输入的命令。 例如,我们可以重复使用next命令来查看我们的(现在固定的)结果用作什么。 假设我们将以前的代码更新为:
需要“ byebug” def fac(num)
拜拜
如果num <= 1
1个
其他
num * fac(数字-1)
结束
结束
fac_4 = fac(4)
如果fac_4 == 24
puts(“成功了!”)
其他
puts(“坏了!”)
结束
然后,我们可以逐步完成调用,并观察通过此调用到达的“ puts”行(注意空白行,然后是“ continue”,最后移至执行的结尾):
matthewk @ matthewk-bonanza〜$ ruby fac_example.rb [1,10]在/home/matthewk/fac_example.rb中
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 1
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(再见)接下来
/home/matthewk/fac_example.rb中的[3,12]
3:def fac(num)
4:再见
5:如果num <= 1
6:1
7:其他
=> 8:num * fac(num-1)
9:结束
10:结束
11:
12:fac_4 = fac(4)
(臭虫)
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 1
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(再见)
/home/matthewk/fac_example.rb中的[3,12]
3:def fac(num)
4:再见
5:如果num <= 1
6:1
7:其他
=> 8:num * fac(num-1)
9:结束
10:结束
11:
12:fac_4 = fac(4)
(臭虫)
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 1
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(再见)
/home/matthewk/fac_example.rb中的[3,12]
3:def fac(num)
4:再见
5:如果num <= 1
6:1
7:其他
=> 8:num * fac(num-1)
9:结束
10:结束
11:
12:fac_4 = fac(4)
(臭虫)
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
=> 5:如果num <= 1
6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(再见)
/home/matthewk/fac_example.rb中的[1,10]
1:要求“ byebug”
2:
3:def fac(num)
4:再见
5:如果num <= 1
=> 6:1
7:其他
8:num * fac(num-1)
9:结束
10:结束
(臭虫)
/home/matthewk/fac_example.rb中的[9,18]
9:结束
10:结束
11:
12:fac_4 = fac(4)
13:
=> 14:如果fac_4 == 24
15:puts(“成功了!”)
16:其他
17:看跌(“它坏了!”)
18:结束
(再见)
/home/matthewk/fac_example.rb中的[9,18]
9:结束
10:结束
11:
12:fac_4 = fac(4)
13:
14:如果fac_4 == 24
=> 15:puts(“成功了!”)
16:其他
17:看跌(“它坏了!”)
18:结束
(byebug)继续
有效!
我们还可以在执行程序时修改变量。 在此示例中,我们使用正在运行的程序打印出一组阶乘:
需要“ byebug” def fac(num)
如果num <= 1
1个
其他
num * fac(数字-1)
结束
结束
数字= [3,4,8,11]
byebugputs(numbers.map {
数
fac(number)})
让我们运行它,然后将numbers更改为一个更简单的数组,然后看看我们想出了什么:
matthewk @ matthewk-bonanza〜$红宝石fac_example.rb [6,15]在/home/matthewk/fac_example.rb中
6:其他
7:num * fac(num-1)
8:结束
9:结束
10:
11:数字= [3、4、8、11]
12:
13:再见
14:
=> 15:puts(numbers.map {
数
fac(number)})
(byebug)数字= [1,2,3,4]
[1、2、3、4]
(byebug)继续
1个
2
6
24
实际上,您实际上可以在脚本的任何位置运行要使用的任何命令。 这使您有可能观察到如果在byebug断点之后添加一段不同的代码会发生什么情况。
这是让您更好地使用byebug并以帮助您快速查找和消除应用程序中的错误的方式使用它的好方法。 有兴趣了解更多细节吗? 请参阅官方文档。 如果您对比较内联调试器感兴趣,可以查看pry。 但是请注意,如果您是为Rails开发的,byebug被认为是默认的,受支持的调试器,因此与在该设置中撬动相比,您可能会在byebug中获得更多的调试支持。
如果您有兴趣从代码中获得更多收益,请使用GitClear,我们使了解代码更改和评估生产率的过程变得异常简单。 只需单击一下,您就可以立即对存储库中的每个更改进行全面分析。 我们支持6种语言(包括Ruby),并且还将提供更多支持。