4

たとえば、特定の 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の引数を使用してメソッドにステップインするにはどうすればよいですか?3article

もちろん、そのメソッドにブレークポイントを設定し、プロダクションをリロードして、デバッグが完了するまですべての顧客をそのブレークポイントで待機させることもできます...しかし、それは最良のアイデアではありません.

では、実行中のirb / pryセッションから特定のインスタンスのメソッドにデバッグする方法はありますか? (どちらでもOKです)

4

3 に答える 3

8

試してみて、さらにグーグルで調べた後、自分に合った解決策を見つけたと思います。

  1. Rails コンソール / irb / pry セッションにログインします。
  2. デバッグしたいコードを 1 行で実行できるように、ケースをセットアップします (例: モデルの読み込み、依存関係の要求など)。
  3. require 'byebug'(またはrequire 'debugger'古いルビーバージョンの場合)
  4. ここで興味深いのは、次のようにデバッグしたい行の前に debugger ステートメントを入れるbinding.pry; user.do_somethingか、debugger; user.do_something
  5. これで、デバッガーが表示されます。メソッドにステップインするには、次の行にジャンプする必要があるかもしれません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) 
于 2016-04-21T07:03:44.657 に答える