LoginSignup
0
0

More than 1 year has passed since last update.

Rubyの勉強会で使用した資料(Rubyでのデバックbinding.pryの使い方)

Last updated at Posted at 2021-10-16

勉強会の状況

100人以上のプログラミング学習コミュニティで勉強会開催。
初学者の方向け
・集まったのは5~8人

デバックとは

デバックとはプログラムにエラーや異常がないかを確認し、修正することです。
実務ではデバックをしながらプログラムを書いたり、エラーの原因を特定する時に
使います。実務をやる上で必須みたいです。

プログラミング以外でもゲームが完成した後に、想定通りに動くかを
検証したりする仕事があります。デバッカーという仕事です。
このデバッカーがいないと、誤った動作をしたままゲームがリリースされてしまいます。

上でも紹介したようにデバックをしないとクライアントにも迷惑をかけてしまう
リスクが出てきます。
プログラマーが開発をする上でデバックをしながら開発していくので必須のスキルとなるので
初学者の段階から毎日の学習でデバックを使い慣らしていく必要があります。

binding.pryとは

このbinding.pryがデバックで使うコマンドです。
必須なので抑えておきましょう。

デバックの導入

以下のコマンドでインストールします。

gem install pry-byebug

binding.pryの使い方

binding.pryにはプログラムの処理を止める機能があります。
処理を止めながらエラーなどを確認していきます。

⚫︎補足
pryとは
pryとはrailsコンソールみたいに、メソッドなどを調べたり、
使えるようにするものです。

binding.pryの使い方を説明していきます。
例えば下のような家族の平均年齢を計算するとします。

practice.rb

father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10

average_age = (fathe_age + mother_age + son_age + daughter_age) /5
puts average_age

このまま実行するとエラーが出ます。

Traceback (most recent call last):
practice.rb:4:in `<main>': undefined local variable or method `fathe_age' for main:Object (NameError)
Did you mean?  father_age

これは4行目の名前が定義されていないというエラーです。原因は何でしょうか。
ここでbinding.pryを使って特定していけます。
  
⚫︎補足
わかる方も多いと思いますが初学者向けに書いてあります。

まずbinding.pryの使い方です。

practice.rb
  require "pry"  #この記述をします(railsでは不要です。)
father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
binding.pry   #止めたい場所
average_age = (fathe_age + mother_age + son_age + daughter_age) /5
binding.pry #止めたい場所
puts average_age

binding.pryはプログラムの処理を止めたい場所に追記しましょう。
require "pry"はRubyの時に使い、railsを使う時は不要です。

プログラムを実行すると下のような表示になります。


From: /Users/taro/Desktop/ruby/practice.rb:58 :

    53: father_age = 50
    54: mother_age = 40
    55: son_age = 20
    56: daughter_age = 10
    57: binding.pry
 => 58: average_age = (fathe_age + mother_age + son_age + daughter_age) /5
    59: binding.pry
    60: puts average_age

=> 58: average_age でプログラムの処理が止まっています。
処理がaverage_ageで止まったので上は特に問題がないということになります。
binding.pryを入れる場所はエラーが出ている場所の1行上に入れます。
処理が止まった場合はそのbinding.pryより上は問題なく
止まらなかった場合はその上に問題がある
ということになります。
binding.pryでエラーが起きている場所を特定していくことができます。

⚫︎補足
53や58はたまたま53,58行目にコードを書いてあるだけです。

[1] pry(main)> son_age
=> 20

son_ageと入力すると、20と返って来るのでson_ageに問題はないとわかります。
他の〇〇ageは問題ないとわかリました。(今回は割愛。son_ageとやり方は同じです。)

5] pry(main)> average_age = (fathe_age + mother_age + son_age + daughter_age) /5  
NameError: undefined local variable or method `fathe_age' for main:Object
Did you mean?  father_age
from (pry):5:in `<main>'

average_age = (fathe_age + mother_age + son_age + daughter_age) /5
入力するとエラーが発生しました。ここでエラーの原因はここだとわかりました。
エラーの内容を翻訳すると
名前のエラーです。fathe_ageというメソッドはオブジェクトで定義されていません。
father_ageという意味ですか。

となります。father_ageがfathe_ageとなっていたのが間違えでした。
以下のように修正してプログラムを実行します。

practice.rb

father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
average_age = (father_age + mother_age + son_age + daughter_age) /5
puts average_age

そしてプログラムを実行すると、

24

これで正しく出力されました。

このような流れでbinding.pryを使いエラーを特定していきます。

処理が止まらない場合も見てみましょう。
複数のbinding.pryを使います。

practice.rb

require "pry"
father_age = 50
mother_age = 40
son_age = 20
daughter_age = 10
binding.pry  #1回目
average_age = (father_age + mother_age + son_age + daughter_age) /5
binding.pry  #2回目
sum_age = father_age + mother_age + son_age + daughter_age
binding.pry  #3回目
puts average_ag
binding.pry #4回目
puts sum_age

これでプログラムを実行していきます。

1] pry(main)> continue  #1回目のbinding.pry

1つ目のbinding.pryは処理が止まっています。この上は問題ないことがわかります。
2,3,と問題なく処理が実行できcontinueを使います。

⚫︎補足
continueはデバックでのプログラムの実行コマンドです。
コマンドについて詳細は下にあります。

4回目のbinding.pryのところに来ると、

[1] pry(main)> continue
Traceback (most recent call last):
each_sample.rb:62:in `<main>': undefined local variable or method `average_ag' for main:Object (NameError)
Did you mean?  average_age

エラーが発生。回目までは問題なく処理が止まっていたので
4回目の上で3回目の下がエラーの箇所と特定できます。

エラーから読み取ると、average_ageのスペルミスです。average_agになっていたのが原因です。
修正しプログラムを実行すると、

[1] pry(main)> continue
120

と出力されました。
これで正しい挙動になったということです。

binding.pryを使うもう一つのメリット

binding.pryを入れることによりプログラムの流れを
確認することもできます。初学者の段階ならどのように
プログラムが処理をされているのかを知る機会になるので
普段の学習から使ってみてください。

binding.pryで使うコマンド

binding.pryでは以下のコマンドを使います。
他のコマンドは知らないのでご自身で調べてください。

next 次の行へ移動

step次の行かメソッド内に入る

continue プログラムの実行

finish 現在のフレームが終わるまで実行

exit! 強制終了

特にcontinueが1番使いました。

⚫︎参考資料
https://qiita.com/AknYk416/items/6f0bec58712edaf4940e
https://pikawaka.com/rails/pry

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0