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

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のことを忘れてしまったら、またこのページをご覧になってください!

この記事を書いた人

こんにちは!貝原(@touhicomu)と申します。
現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。
現住所は、日本の西海岸、長崎県は波佐見町です。田舎ライフです。^^
地元の観光団体「笑楽井石」にボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。
以下の活動も行っています。
 ・笑楽井石のブログ
 ・エクセル関数を日本語化するソフト
 ・エクセルVBAを日本語で記述するソフト

目次