我在Ruby代码中有一个很少重现的错误.通过不断地运行我的测试套件,我每10-15分钟就会得到一次.
我想做的是一步一步地记录执行过程,一旦失败,就继续调试发生的事情.
我知道大约https://rr-project.org/个,我用它在C++中调试了这样的东西.它基本上为您提供了一个完整的gdb接口来进行录制回放.如果能有类似的东西就太好了.
我在Ruby代码中有一个很少重现的错误.通过不断地运行我的测试套件,我每10-15分钟就会得到一次.
我想做的是一步一步地记录执行过程,一旦失败,就继续调试发生的事情.
我知道大约https://rr-project.org/个,我用它在C++中调试了这样的东西.它基本上为您提供了一个完整的gdb接口来进行录制回放.如果能有类似的东西就太好了.
有一项录音功能:
# intermittent.rb
require "debug"
# figure out your break condition
binding.b do: "catch TypeError"
binding.b do: "record on"
# this is slow ^
class M
def m
var = rand(10)
var = "1" if rand(1000) == 666
var
end
end
loop do
M.new.m + 1
end
我从未真正用过它,但你可以退后一步:
$ ruby ./intermittent.rb
Stop by #0 BP - Catch "TypeError"
(rdbg) step back
[replay] [6, 15] in ./intermittent.rb
[replay] 6|
[replay] 7| class M
[replay] 8| def m
[replay] 9| var = rand(10)
[replay] 10| var = "1" if rand(1000) == 666
[replay] => 11| var
[replay] 12| end
[replay] 13| end
[replay] 14|
[replay] 15| loop do
[replay] =>#0 M#m at ./intermittent.rb:11
[replay] #1 block in <main> at ./intermittent.rb:16
[replay] # and 2 frames (use `bt' command for all frames)
(rdbg) info
[replay] %self = #<M:0x00007f946d07ef28>
[replay] var = "1"
(rdbg) step back
(rdbg) info
[replay] %self = #<M:0x00007f946d07ef28>
[replay] var = 2
# etc...
100