Rubyのpry-byebugを使いこなす!7つの方法

こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。今日は、Rubyのpry-byebugについて解説したいと思います。pry-byebugというと、

  • pry-byebugのインストール方法がよくわからない!
  • pry-byebugのデバッグ用のコマンドはどう使えばいいの?

と疑問に思う方もたくさんいらっしゃると思います。そこで!今回は、

  • pry-byebugのインストールについてまとめ
  • pry-byebugのデバッグ用コマンドについてまとめ

の解説をしていきたいと思います。それでは、行って見ましょう!

目次

Rubyのpry-byebugをインストールする方法

Mac/Linuxにpry-byebugをインストールする方法

pry-byebugをMacやLinuxにインストールするには、gemを使ってインストールします。

gem install pry-byebug

Winowsにpry-byebugをインストールする方法

pry-byebugをWindowsにインストールする場合は、最新版のRubyInstallerのrubyには、pry-byebugが対応していない場合があり、注意が必要です。

もし、pry-byebugをWindowsにインストールする際にエラーが発生した場合は、RubyInstallerのバージョンを下げて試してみてください。

なお、筆者のところでは、RubyInstaller v2.3.3 ではpry-byebugはインストールできず、RubyInstaller v2.0.0にしたら、pry-byebugがインストールできました。ただし、RubyInstaller v2.0.0 のSSL証明書が問題でruby自体のインストールができないため、以下に回避方法を載せています。

RubyInstallerのダウンロードとインストール:
UR+:http://www.rubylife.jp/install/install/index1.html

古いRubyInstallerのSSL証明書問題を回避する方法:
URL:http://qiita.com/shimoju/items/394818b4989b94680aaf

DevKitのインストール:
URL:http://www.rubylife.jp/railsinstall/rails/index4.html

後は、Windowsでも、gemで、

gem install pry-byebug

するだけです。

readlineが問題でpry-byebugがインストールできない場合

まれに、readlineがインストールされていないことが原因で、pry-byebugがインストールできない場合があります。その場合は、rb-readlineをpry-byebugより先にgemでインストールします。
URL:http://qiita.com/KanakoKobayashi/items/32bf91437bc1de1a779a

gem install rb-readline
gem install pry-byebug

Rubyのpry-byebugでデバッグする方法

ブレークポイントをセットし、デバッグモードにする方法

pry-byebugを起動して、rubyのコードをデバッグモードにするには、コードの中に、「binding.pry」を記述しておきます。

require "pry"

a = "apple"
b = "bake"
c = "cookie"

binding.pry 
eats = a + b + c
msg = "I eats " + eats + " today."
p eats
p msg

その後、上のスプリクトを実行すると、binding.pryのところで処理が止まって、pry-byebugが起動します。

From:01_ruby_pry.rb @ line 9 :

     4: a = "apple"
     5: b = "bake"
     6: c = "cookie"
     7:
     8: binding.pry
 =>  9: eats = a + b + c
    10: msg = "I eats " + eats + " today."
    11: p eats
    12: p msg
[1] pry(main)>

[1] pry(main)>

のところに、pry-byebugのデバッグ用コマンドを指定できます。

デバッグモード時にブレークポイントをセットする方法

デバッグモード時に、好きが行にブレークポイントをセットするには、以下のようにpry-byebugのコマンドプロンプトにコマンドを指定します。

[1] pry(main)> break 11

これで、行11にブレークポイントが設定され、以下のような表示になります。

  Breakpoint 1: 01_ruby_pry.rb @ 11 (Enabled)

       8: eats = a + b + c
     9: msg = "I eats " + eats + " today."
    10: p eats
 => 11: p msg

後は、continueコマンドを実行すれば、処理が進み、先ほど設定した行11で処理がとまります。

[2] pry(main)> continue
"applebakecookie"

  Breakpoint 1. First hit

From:01_ruby_pry.rb @ line 11 :

     6:
     7: binding.pry
     8: eats = a + b + c
     9: msg = "I eats " + eats + " today."
    10: p eats
 => 11: p msg
[2] pry(main)>

変数の中身を見る方法

デバッグモード時は、各種変数の値を確認できます。pry-byebugのコマンドプロンプトに変数名のみ書いてEnterすると、その変数の中身が表示されます。

From:01_ruby_pry.rb @ line 11 :

     6:
     7: binding.pry
     8: eats = a + b + c
     9: msg = "I eats " + eats + " today."
    10: p eats
 => 11: p msg
[11] pry(main)> eats
=> "applebakecookie"
[12] pry(main)>

上の例では、eatsの中身、”applebakecookie”が表示されていますね。

ステップ実行する方法

ステップイン

デバッグモードで、1行ずつ実行していくことを、ステップ実行といいます。

その中で、ステップインとは、1行ずつ実行するけれども、間に関数があった場合、関数の中に入ってステップ実行を続けるというコマンドです。ステップインのpry-byebugコマンドは、「step」です。ここで例に示すサンプルコードは以下の通りです。

require "pry"

def grouping(a,b,c)
 return a+b+c
end

a = "apple"
b = "bake"
c = "cookie"

binding.pry
eats = grouping(a,b,c)
msg = "I eats " + eats + " today."
p eats
p msg

実際にpry-byebugでデバッグモードにしてステップインした状態は以下の通りです。

From:02_ruby_pry_step.rb @ line 12 :

     7: a = "apple"
     8: b = "bake"
     9: c = "cookie"
    10:
    11: binding.pry
 => 12: eats = grouping(a,b,c)
    13: msg = "I eats " + eats + " today."
    14: p eats
    15: p msg
[1] pry(main)> step

From:02_ruby_pry_step.rb @ line 4 Object#grouping:

    3: def grouping(a,b,c)
 => 4:  return a+b+c
    5: end
[1] pry(main)>

上の例のように、行12でstepコマンドを使うと、関数groupingの中に入って行きますね。

ステップオーバー

ステップオーバーとは、ステップインと異なり、間に関数があっても、その上を飛び越えて次の行に移るステップ実行のことです。ステップオーバーのpry-byebugのコマンドは、「next」です。

From: 02_ruby_pry_step.rb @ line 12 :

     7: a = "apple"
     8: b = "bake"
     9: c = "cookie"
    10:
    11: binding.pry
 => 12: eats = grouping(a,b,c)
    13: msg = "I eats " + eats + " today."
    14: p eats
    15: p msg
[1] pry(main)> next

From:02_ruby_pry_step.rb @ line 13 :

     8: b = "bake"
     9: c = "cookie"
    10:
    11: binding.pry
    12: eats = grouping(a,b,c)
 => 13: msg = "I eats " + eats + " today."
    14: p eats
    15: p msg
[1] pry(main)>

上の例のように、関数groupingをオーバーして、次の行13に進んでいますね。

ステップアウト

ステップアウトとは、ステップインして関数の中に入ってステップ実行している際に、関数の外に出たところまで、実行を移すコマンドのことです。ステップインする必要がなくなった際に、関数から素早く抜け出る際に使用します。

pry-byebugのステップアウトのコマンドは、「fininsh」です。

From:02_ruby_pry_step.rb @ line 4 Object#group
ing:

    3: def grouping(a,b,c)
 => 4:  return a+b+c
    5: end
[1] pry(main)> finish

From:02_ruby_pry_step.rb @ line 13 :

     8: b = "bake"
     9: c = "cookie"
    10:
    11: binding.pry
    12: eats = grouping(a,b,c)
 => 13: msg = "I eats " + eats + " today."
    14: p eats
    15: p msg
[1] pry(main)>

上の例では、関数groupingの中でfinishコマンドを使って、関数を抜け出ています。そして、行13のところで、実行が止まっています。

スタックフレームを移動する方法

ステップ実行と重なりますが、関数の呼び出し階層のことをスタックフレームと言います。関数呼び出しがあると必ず、1つのスタックフレームが積まれます。

pry-byebugでは、このスタックフレームを元に戻して上の階層に戻ったり(up)、下の階層に潜ったり(down)<、自由に移動できます。サンプルコードは以下の通りです。

require "pry"

def grouping(a,b,c)
 t1 = add(a,b)
 t2 = add(t1,c)
 return t2
end

def add(v1,v2)
  return v1+v2
end

a = "apple"
b = "bake"
c = "cookie"

binding.pry
eats = grouping(a,b,c)
msg = "I eats " + eats + " today."
p eats
p msg

pry-byebugを使って、スタックフレームを移動する様子は以下の通りです。

From:03_ruby_pry_stack.rb @ line 18 :

    13: a = "apple"
    14: b = "bake"
    15: c = "cookie"
    16:
    17: binding.pry
 => 18: eats = grouping(a,b,c)
    19: msg = "I eats " + eats + " today."
    20: p eats
    21: p msg
[1] pry(main)> step

From:03_ruby_pry_stack.rb @ line 4 Object#grouping:

    3: def grouping(a,b,c)
 => 4:  t1 = add(a,b)
    5:  t2 = add(t1,c)
    6:  return t2
    7: end
[1] pry(main)> step

From:03_ruby_pry_stack.rb @ line 10 Object#add:

     9: def add(v1,v2)
 => 10:   return v1+v2
    11: end
[1] pry(main)> up

From:03_ruby_pry_stack.rb @ line 4 Object#grouping:

    3: def grouping(a,b,c)
 => 4:  t1 = add(a,b)
    5:  t2 = add(t1,c)
    6:  return t2
    7: end
[1] pry(main)> down

From:03_ruby_pry_stack.rb @ line 10 Object#add:

     9: def add(v1,v2)
 => 10:   return v1+v2
    11: end
[1] pry(main)>

上の例のように、upとdownで関数の呼び出し階層を移動できていますね。

まとめ

いかがでしたか。pry-byebugのインストールは、gemを使えば、比較的容易に行うことができましたね。pry-byebugは非常に使えるパッケージですので、これを機会に皆さんも導入を検討して頂ければ幸いです。

pry-byebugの解説では、デバッグモードに入るブレークポイントの設定方法、行を指定してのブレークポイントの設定方法、変数の中身を見る方法を解説してきました。

コードを動かしながら変数の中身を確認できればデバッグもスムーズに行きますね。ステップイン、ステップオーバー、ステップアウトなどのステップ実行コマンドも、デバッグでは必須になってくる重要なテクニックです。

また、関数の呼び出し階層(スタックフレーム)を自由に移動できるup、downコマンドもかなり便利です。移動した階層で変数の中身を表示すれば、どこでどの変数の値がおかしいのかわかり、デバッグも進みますね。

以上のように、pry-byebugはとてもデバッグに重宝するツールですので、ぜひ、ここで覚えられておいてください。pry-byebugのことを忘れてしまったら、またこのページをご覧になってください!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次