🍒 はじめに
チェリー本輪読会の第16週目のエントリーになります。
輪読会の概要については第1週目にまとめています。
- 第1週目のエントリーはこちら
- 第2週目のエントリーはこちら
- 第3週目のエントリーはこちら
- 第4週目のエントリーはこちら
- 第5週目のエントリーはこちら
- 第6週目のエントリーはこちら
- 第7週目のエントリーはこちら
- 第8週目のエントリーはこちら
- 第9週目のエントリーはこちら
- 第10週目のエントリーはこちら
- 第11週目のエントリーはこちら
- 第12週目のエントリーはこちら
- 第13週目のエントリーはこちら
- 第14週目のエントリーはこちら
- 第15週目のエントリーはこちら
🍒 輪読会 第16週目まとめ
第11章11.1.1〜第11章11.6まで
期間:2021年9月6日〜2021年9月10日
デバッグ とは
デバッグとは、プログラムで起こる不具合の原因を探し出し直すことを指します。
バックトレース とは
プログラムの実行中にエラー(例外)が発生すると、出力される情報のことをバックトレースと呼びます。以下、リンク先の資料には、「メソッドの呼び出し状況を表したデータ」と書いてありました。
バックトレースは、上に行くほどエラーに近いので、一番上がエラーの発生場所になります。
エラー内容が上から下に遡る(trace back to)しています。
よく発生する例外クラス(Exceptionクラス)
アプリケーションの実行中に発生するエラーを表すオブジェクトです。
るりまには多く例外クラスが掲載されています。
その中でも発生頻度の多い例外クラスがチェリー本では解説されています。
- NameError
- 未定義のローカル変数や定数、privateメソッドなどを呼び出したときに発生
- NoMethodError
- 存在しないメソッドを呼び出そうとしたときに発生
- TypeError
- 期待しないクラスがメソッドの引数に渡されたときに発生
- ArgumentError
- 引数の数が違ったり、期待する値ではなかったりした場合に発生
- ZeroDivisionError
- 整数を0で除算しようとしたときに発生(1/0 のように0で割ってはいけないとき)
- SystemStackError
- 無限ループなど、メソッドを再帰呼び出しした場合に発生
- LoadError
- requireやloadに失敗したときに発生
- SystemError(syntax error)
- 構文エラー、endやカンマの不足、丸括弧などが閉じていないなどが原因で発
printデバッグ
printデバッグは、簡単ですぐに使えるデバック方法です。私も一番最初に覚えました。
printデバッグと呼びますが、主に、p
や puts
を使って行われます。変数やメソッドの値を出力したり、条件分岐が意図した通りに実行されているかどうかを確認したりに使えます。
printデバックと呼ばれる方法は以下の4つのメソッドが存在します。
- printメソッド
- putsメソッド
- pメソッド
- ppメソッド(prity printの略)
デバッカ(Byebug)を使う
デバッガを使えば対話的にデバッグをすることができます。
プログラムをステップ実行しながら変数の中身を確認したり、実行される条件分岐を確認したりすることができます。
Rubyの標準ライブラリとして提供されているdebug
ライブラリがありますが、開発の現場ではdebug
ライブラリよりも、Byebug
という外部ライブラリ(Gem)が使われることが多いようです。
使い方については、伊藤さんのByebugチュートリアルが参考になります。
binding.irb
チェリー本では紹介されていませんが、フィヨルドブートキャンプのメンターさんからbinding.irb
を使ったデバッグ方法も伝授していただきましたので紹介したいと思います。
下記のコードようにbinding.irb
を挟むと、そこでデバック作業が発動し、irb
が起動するしくみです。
def fizz_buzz(n) if n % 15 == 0 "Fizz Buzz" elsif n % 3 == 0 "Fizz" elsif n % 5 == 0 "Buzz" else n.to_s end end binding.irb
ブレークポイントでirb
が起動するので、試したいコードを打ち込むことが可能になります。
今回は、fizz_buzzメソッドを入力してみました。
$ ruby test/fizz_buzz_test.rb lib/fizzbuzz.rb @ line 12 : 7: "Buzz" 8: else 9: n.to_s 10: end 11: end => 12: binding.irb 13: 14: 15: # require 'minitest/autorun' 16: # 17: # class FizzBuzzTest < Minitest::Test irb(main):001:0> fizz_buzz(15) => "Fizz Buzz" irb(main):002:0> fizz_buzz(99) => "Fizz" irb(main):003:0> fizz_buzz(7) => "7"
binding.irb
を使ったやり方のメリットはデバッガ等の設定をしなくて済むので手軽であること、コードを止めた時点でアクセス(利用)可能な変数やメソッドにアクセスできるので好き勝手コードを打って試行錯誤が試せることです。
「エラーが出ました。どうすればいいですか?」から卒業するための基本と極意
以下では、デバッグの基本と極意が学べます。
日々ハマりまくっているので偉そうなことは書けませんが、デバッグって本当に初心者の方の壁だと思っています。同じバグで何日も詰まったことは数知れず。心が何度も折れそうになりました。。。 何度もメンターさんにペアプロしていただいて助けていただいています。そんな時に痛感することなのですが、メンターさんのデバッグの的確さ、そして速さ。本当に魔法のように問題が解決していきます。
まだまだ初心者を抜け出せたとは言えないませんが、この動画や本書の内容を日々実践し、デバッグ力を上げていきたいと思います。
参考書籍
- 伊藤淳一 著/『プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで』/技術評論社/2017年https://gihyo.jp/book/2017/978-4-7741-9397-7
- 五十嵐邦明,松岡浩平 著/『ゼロからわかる Ruby 超入門』/技術評論社/2018年https://gihyo.jp/book/2018/978-4-297-10123-7
- 高橋征義、後藤裕蔵 著/『たのしいRuby第6版』/SBクリエイティブ/2019年https://tanoshiiruby.github.io/6/index.html
- プログラミング言語 Ruby リファレンスマニュアル https://docs.ruby-lang.org/ja/
🍒 まとめ
輪読会が終わり、かれこれ3ヶ月も経ってしまいましたが、第16週目のブログを書きました。
1週目をスタートしたときから「最終週まで書き上げる!」と自分の中で目標を決めていたので、今更ですが書いてみました。次は最終週です!
では、また!(次回、第17週目(最終週))