我在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

Ruby相关问答推荐

有没有办法保存 ruby​​ 代码的执行,以便稍后使用逐步重播对其进行调试?

Ruby 符号到类

如何打开(读写)或创建允许截断的文件?

在 Ruby 中导出环境变量

由模块中定义的另一个覆盖方法

Ruby 哈希文字的顺序是否得到保证?

Ruby:将unix时间戳转换为日期

比较ruby中的两个字符串

如何在运行时判断 Ruby 中的 Gem 版本?

如何在Ruby中获取终端窗口的宽度

STDERR.puts 与 Ruby 中的 puts 有何不同?

动态设置 Ruby 对象的属性

获取Ruby中当前目录的父目录

在 Ruby 中,获取数组中最大值的索引的最简洁方法是什么?

安装 Jekyll 时出错 - 本机扩展构建

如果公司使用 C++、C# 或 Java 作为应用程序语言,为什么要学习 Perl、Python、Ruby?

为依赖于环境变量的代码编写规范的最佳方法是什么?

将字符串与Ruby中的数字连接起来

我更改存储库 URL 后 Capistrano 部署失败

如何在ruby脚本中隐藏终端的密码输入