当我查找问题时,例如使用特定的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会话调试特定实例的方法? (两者都可以)
答案 0 :(得分:2)
在尝试了更多的谷歌搜索后,我想我找到了一个适合我的解决方案。
require 'byebug'
(或require 'debugger'
旧版ruby版本)binding.pry; user.do_something
或debugger; user.do_something
next
跳转到下一行(如果您启用了快捷方式,则只需n
)以进入您的方法。以下是我们的生产系统的完整示例:
[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
进行检查。因为我们不重启生产服务器所以不要担心你的改变。