Help us understand the problem. What is going on with this article?

Ruby / Ruby on Rails デバッグ方法まとめ

More than 1 year has passed since last update.

Ruby単体でのデバッグ方法とRailsでのデバッグ方法をまとめてみました。

Rubyのようなスクリプト言語ではIDEではなく、テキストエディタで開発する場合が多いと思います。そのような環境でRubyを始めた当初はそもそもデバッグが無理と思い込んでいましたが、デバッグ用のbyebugというgemを用意すれば簡単にデバッグできます。

本記事ではRuby / Ruby on Railsをテキストエディタで開発している方を対象として、byebugを使用したデバッグの方法を紹介します。

環境

  • Ruby : 2.4.2
  • Ruby on Rails : 5.1.4
  • Byebug : 9.1.0
  • OS : Ubuntu 16.04.3

Rubyスクリプト単体でデバッグする

Byebugをインストールする

bundlerを使用していない場合はgem install で環境にbyebugをインストールします。

$ gem install byebug

Building native extensions.  This could take a while...
Successfully installed byebug-9.1.0

bundlerを使用してgemを管理している場合は、Gemfileにbyebugを追加します。

Gemfile
gem 'byebug'

あとはbundle installでインストールします。

$ bundle install

Fetching gem metadata from https://rubygems.org/.......
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Using bundler 1.15.4
Fetching byebug 9.1.0
Installing byebug 9.1.0 with native extensions
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

正常にインストールが完了するとbyebug -vでインストールされていることを確認できます。

$ byebug -v

  Running byebug 9.1.0

起動

byebugを起動するには byebug コマンドの後ろに実行するファイル名を指定します。

$ byebug sample.rb

起動すると以下のようにコンソールにソースが展開されます。=>は現在の行を表し、(byebug)プロンプトが表示されるので、ここにコマンドを入力し、デバッグします。

$ byebug sample.rb

[1, 10] in /vagrant/ruby_app/sample.rb
=>  1: class Hoge
    2:   def foo
    3:     p 'foo_method!!!'
    4:     bar('hello')
    5:   end
    6:
    7:   def bar(val)
    8:     p val
    9:   end
   10: end
(byebug)

コマンドがわからなければ、help コマンド名と入力すれば使い方が確認できます。同時に短縮形のコマンドも確認できます。
以下、よく使用するコマンド(短縮形)を抜粋して紹介します。

ステップ実行

- n        ステップオーバー
- s        ステップイン
- fin      ステップアウト
- c        続行
- restart  最初から再実行

ブレークポイント

- b n      n行目にブレークポイントを設定 (ex. b 8)
- del n    n行目のブレークポイントを削除 (ex. del 8)
- info b   ブレークポイントを一覧表示

変数の出力

- v l      ローカル変数を表示
- v i      インスタンス変数を表示

ウォッチ

disp 変数   指定した変数をウォッチ
undisp n    n番目にウォッチしている変数を削除

その他

help       ヘルプ表示 ([help コマンド]でコマンドの使用方法を表示)
quit       byebugを終了
list       実行中のソースコード周辺10行を表示
irb        irbを起動

Railsでデバッグする

基本的にはRubyスクリプト単体で実行する方法と同じです。
そもそもRails newするとデフォルトでGemfileにbyebugが入っています。byebugがインストールされてなければ、上記「Byebugをインストールする」で記載したようにGemfileに追加して、bundle installして下さい。

あとは以下の通り実施するとデバッグできます。

  • デバッグしたい箇所にbyebugと埋め込む
class EntryController < ApplicationController

  def new
    @user = User.new
    byebug
  end
  • rails server で起動する
  • 画面から対象ソースが実行される操作を行う
  • コンソールからbyebugコマンドでデバッグ

[おまけ] Railsでデバッグする (better_errors)

better_errorsとbinding_of_callerというGemを使用するとブラウザからirbでの操作ができます。(ステップ実行などは不可)
画面の左がスタックトレース、右上にコード表示とirbによるコマンド操作(赤枠部分)が可能です。右下にリクエスト情報や変数が参照できます。

better_errors.jpg

  • bettor_errorsとbinding_of_callerをインストールする

better_errorsbinding_of_callerをGemfileに追加し、bundle installします。

Gemfile
group :development, :test do
  gem 'better_errors'
  gem 'binding_of_caller'
end
  • rails server で起動する

あとはエラーが発生すると上記のような画面がブラウザに表示されます。
よくやる方法として、確認したい箇所にraiseを埋め込んで強制的にエラー発生させて確認したりもします。

※vagrant環境では以下の設定が必要なようです。
参考:https://qiita.com/osamu1203/items/c72a1b2c27ac3e02cb15

サンプルソース

「Rubyスクリプト単体でデバッグする」で使用したものです。

sample.rb
class Hoge
  def foo
    p 'foo_method!!!'
    bar('hello')
  end

  def bar(val)
    p val
  end
end

hoge = Hoge.new
hoge.foo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした