从生产irb

时间:2016-04-20 14:29:17

标签: ruby-on-rails ruby debugging irb byebug

当我查找问题时,例如使用特定的ActiveRecord对象,我经常发现自己在生产系统上执行以下操作:

# RAILS_ENV=production bundle exec

irb(main)> article = Article.find(123)
=> #<Article id: 123, title: "Foobar">
irb(main)> article.do_something(3)
NoMethodError: undefined method `id' for nil:NilClass

有时我无法重现,为什么行article.do_something(3)会抛出错误,所以我想在生产模式下直接在我的服务器上调试它。

现在的问题是:如何在对象/实例#do_something上使用参数3进入方法article

当然,可以在该方法中设置断点,重新加载生产并让所有客户在该断点处等待,直到我完成调试......但这不是最好的主意。< / p>

  

那么,有没有办法从正在运行的irb / pry会话调试特定实例的方法? (两者都可以)

5 个答案:

答案 0 :(得分:2)

在尝试了更多的谷歌搜索后,我想我找到了一个适合我的解决方案。

  1. 登录rails console / irb / pry session
  2. 设置您的案例(例如加载模型,需要依赖项......),以便您可以在一行中执行要调试的代码
  3. require 'byebug'(或require 'debugger'旧版ruby版本)
  4. 现在有趣的部分:将调试器语句放在要调试的行的前面,如binding.pry; user.do_somethingdebugger; user.do_something
  5. 现在你在调试器中。也许您必须使用next跳转到下一行(如果您启用了快捷方式,则只需n)以进入您的方法。
  6. 以下是我们的生产系统的完整示例:

    [1] pry(main)> require 'byebug'
    => true
    [2] pry(main)> user = User.find(2)
      User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
    => #<User id: 2, name="XXX XXX">
    [3] pry(main)> user.full_name
    NameError: undefined local variable or method address for #<User:0x0055b168663590>
    
    [4] pry(main)> binding.pry; user.full_name
    
    [68, 73] in /usr/src/app/app/models/user.rb
       68:   end
       69: 
       70:   def full_name
    => 71:     "#{address.firstname} #{address.last_name}"
       72:   end
       73: end
    (byebug) 
    

答案 1 :(得分:1)

在生产服务器中进行调试是个糟糕的主意。来自PHP世界,我们曾经一直这样做,事情会非常爆炸,只有你幸运的是有数据库备份。

相反,你可以做的是设置一个临时服务器 - 这将是一个服务器,它在完全相同的平台上运行完全相同的设置。您甚至可以将cron与@foreach ($permissions as $permission) <tr> <td><label class="css-input css-checkbox css-checkbox-primary"> {!! Form::checkbox('permissions['.$permission->id.']', $permission->id, $role->permissions->contains($permission->id)) !!}<span></span></label></td> <td>{{ $permission->title }}</td> <td>{{ $permission->slug }}</td> <td>{{ $permission->description }}</td> </tr> @endforeach 一起使用,以便每天镜像生产数据库,以便您可以尝试新功能,甚至可以将其显示给协作者。如果它爆炸,那么它不是世界末日 - 并且没有丢失最终用户数据的风险。

但您可能会认为您实际应该编写测试而不是使用断点或日志。编写一个复制问题的测试并指定所需的行为。然后,您可以使用代码,并从测试状态了解您正在执行的操作是什么。

答案 2 :(得分:-1)

你可以使用pry-debugger(通过ruby 1.9.3)或pry-byebug(Ruby&gt; = 2)。

这两个允许您设置断点,允许您在代码运行时交互式地遍历代码,检查变量值,方法返回值等。

如何使用生产数据管理这些我不太确定,但这将允许您调试特定方法。

答案 3 :(得分:-1)

您可以采用简单的方式,并尝试通过puts进行调试。您可以根据需要在方法中添加尽可能多的puts,然后每行可能会导致问题

答案 4 :(得分:-1)

您可以更改代码中的代码,以便在#do_something方法中输入要检查的值,然后运行irb进行检查。因为我们不重启生产服务器所以不要担心你的改变。