使用 pry-byebug 设置条件断点
Set conditional breakpoint with pry-byebug
给定以下代码:
require 'pry-byebug'
10.times.with_index do |i|
binding.pry
puts i
end
我想在里面 "loop until i == 5
then break" pry-byebug
。从 运行 到 help break
看来你可以通过 "breakpoint #" 或 "line #" 来识别断点。您似乎也可以使用条件,但我没有让它工作:
正在尝试在行 #:
上设置断点
$ ruby foo.rb
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[1] pry(main)> break foo.rb:5 if i == 5
Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 5 (Enabled) Condition: i == 5
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[2] pry(main)> continue
0
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[2] pry(main)> i
=> 1
先设置断点再把条件放在断点上:
➜ ~/D/w/t/pry_debug ruby foo.rb
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[1] pry(main)> break foo.rb:15
Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 15 (Enabled)
[2] pry(main)> break --condition 1 i == 5
[3] pry(main)> c
0
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[3] pry(main)> i
=> 1
如您所见,在这两种情况下 pry-byebug
都不符合条件,因为它停止得太早了。我如何让它工作?
我认为一种简单的方法是在您的代码中执行此操作:
require 'pry-byebug'
10.times.with_index do |i|
binding.pry if i == 5
puts i
end
或者如果你想在异常时停止,你可以这样做:
require 'pry-byebug'
10.times.with_index do |i|
puts i rescue binding.pry # if the puts command throws an exception, you'll be taken to pry
end
从循环内部删除 binding.pry
并将其放在 10.times
:
之前
binding.pry
10.times.with_index do |i|
然后运行代码。当它到达断点时,然后使用您想要的条件和 continue
.
设置一个新断点
回到你的实际代码。不要这样做:
10.times.with_index do |i|
相反,这将做几乎相同的事情,但它更简单:
10.times do |i|
这是 Ruby 正在做的事情:
>> 2.times.with_index.to_a
[
[0] [
[0] 0,
[1] 0
],
[1] [
[0] 1,
[1] 1
]
]
对比
>> 2.times.to_a
[
[0] 0,
[1] 1
]
首先是传入 [0,0]
、[1,1]
等数组,因此为了正确起见,您的块参数需要类似于:
10.times.with_index do |i, j|
第二个只传递当前 "times" 值,导致代码更简单。
给定以下代码:
require 'pry-byebug'
10.times.with_index do |i|
binding.pry
puts i
end
我想在里面 "loop until i == 5
then break" pry-byebug
。从 运行 到 help break
看来你可以通过 "breakpoint #" 或 "line #" 来识别断点。您似乎也可以使用条件,但我没有让它工作:
正在尝试在行 #:
上设置断点$ ruby foo.rb
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[1] pry(main)> break foo.rb:5 if i == 5
Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 5 (Enabled) Condition: i == 5
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[2] pry(main)> continue
0
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[2] pry(main)> i
=> 1
先设置断点再把条件放在断点上:
➜ ~/D/w/t/pry_debug ruby foo.rb
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[1] pry(main)> break foo.rb:15
Breakpoint 1: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ 15 (Enabled)
[2] pry(main)> break --condition 1 i == 5
[3] pry(main)> c
0
From: /Users/max/Dropbox/work/tmp/pry_debug/foo.rb @ line 5 :
1: require 'pry-byebug'
2:
3: 10.times.with_index do |i|
4: binding.pry
=> 5: puts i
6: end
[3] pry(main)> i
=> 1
如您所见,在这两种情况下 pry-byebug
都不符合条件,因为它停止得太早了。我如何让它工作?
我认为一种简单的方法是在您的代码中执行此操作:
require 'pry-byebug'
10.times.with_index do |i|
binding.pry if i == 5
puts i
end
或者如果你想在异常时停止,你可以这样做:
require 'pry-byebug'
10.times.with_index do |i|
puts i rescue binding.pry # if the puts command throws an exception, you'll be taken to pry
end
从循环内部删除 binding.pry
并将其放在 10.times
:
binding.pry
10.times.with_index do |i|
然后运行代码。当它到达断点时,然后使用您想要的条件和 continue
.
回到你的实际代码。不要这样做:
10.times.with_index do |i|
相反,这将做几乎相同的事情,但它更简单:
10.times do |i|
这是 Ruby 正在做的事情:
>> 2.times.with_index.to_a
[
[0] [
[0] 0,
[1] 0
],
[1] [
[0] 1,
[1] 1
]
]
对比
>> 2.times.to_a
[
[0] 0,
[1] 1
]
首先是传入 [0,0]
、[1,1]
等数组,因此为了正确起见,您的块参数需要类似于:
10.times.with_index do |i, j|
第二个只传递当前 "times" 值,导致代码更简单。