Chapter 09

デバッグ

ikuma-t
ikuma-t
2022.02.02に更新

デバッグ

このChapterではRubyMineでデバッグをするために必要な最低限の機能を紹介します。

RubyMineには強力なデバッガが備わっています。
binding.pryもいいですが、RubyMineのデバッガを利用することで、効率的にデバッグをしていきましょう。

デバッグの構成:Edit Configurations...

未実行(※)のソースに対してデバッグを実行するには、デバッグの構成を設定する必要があります。
(※ナビゲーションバーの実行ファイル名が「ADD CONFIGURATION」になっている状態です)
手動で設定を行っても良いのですが、ファイルを一度実行すれば実行構成が作成されるので、そちらを利用します。

右クリック > コンテキストメニューから「Debug '<ファイル名>'」を選択することで、ファイルを実行します。
実行が完了すると、ナビゲーションバーに実行ファイル名が設定されます。これでデバッグの構成の初期設定は完了です。

詳細な設定を行うために、プルダウンから「Edit Configurations...」を選択します。

画面左側に実行可能なファイルの一覧が表示されています。実行対象のファイルを選択すると、画面右側に設定が表示されます。
「Script Arguments」の欄に文字列を入力することで、コマンドライン引数を設定することができます。
(例えば、<コマンド> -l fileのように実行したいコマンドがあれば、-l fileを入力します)

デバッグの実行:Debug( + D

デバッグの実行方法については、先程のようにポップアップメニューから選択する方法もありますが、 ( + D)を入力することで起動することもできます。
この時実行されるファイルは、ナビゲーションバーに表示されているファイルになります。

ブレークポイントの設定:Toggle Line Breakpoint( + F8

ブレークポイントはデバッグ実行時に処理を一時停止するポイントになります。

ブレークポイントは以下のいずれかの方法で設定および解除可能です。

  • 設定したい行のガターをクリックする
  • 設定したい行で( + F8)を入力する

またブレークポイントは複数設定可能です。

ブレークポイントの確認:View Breakpoints( + Shift + F8

複数ソースにまたがるコードを検証していくと、ブレークポイントが煩雑になってくることがあります。
+ Shift + F8)を入力することで、ブレークポイントの一覧を確認することができます。

チェックをオフにすることで、ブレークポイントを無効(ブレークポイントは設定されているが、そこで処理が中断しない)にすることができ、
プレビューエディタ中のブレークポイントをオフにすることで、ブレークポイントの解除を行うことができます。

デバッグツールウィンドウ

デバッグを実行すると、デバッグツールウィンドウが自動で立ち上がります。

番号 概要
1 デバッグの停止・再開・設定等を制御する
2 デバッグの実行を進める。ショートカットでも代用可能。
3 変数ウィンドウ。実行中のプログラムに使用されている変数が表示される。
4 ウォッチウィンドウ。指定した変数を監視できる。「+」ボタンで式を追加する

ステップ実行

ブレークポイントで中断した処理を再開し、処理を進めてプログラムをデバッグしていきます。
この時、中断したポイントからプログラムを進める方法は以下の5種類です。

番号 アイコン 名称 ショートカット 概要
1 Step Over F8 メソッドがある場合でも、それをスキップして処理を進めます
2 Step Into F7 メソッドがある場合は、その内部処理へと移動します
3 Force Step Into + Shift + F7 通常のステップインでスキップされてしまう場合でも、強制的にメソッドの中に移動します。ざっくりいうと、Step Intoは深いところの処理はスキップするような設定になっており、それらをスキップしないようにする方法となります。
4 Step Out Shift + F8 メソッドの中にいる場合、その処理を抜け出し、呼び出し元に戻ります
5 Run to Cursor + F9 カーソルの位置に達するため処理を進めます

実践例

students = %w[Alice Bob Charly Donkey]
upcase_student = students.map(&:upcase)
puts upcase_student

簡単なプログラムで実際に各ウィンドウがどう変わるのかをみてみます。

デバッグ実行前の状態です。プログラムの開始時点にブレークポイントを設定し、ウォッチウィンドウにはstudents.join(' ')を登録してあります。

+ D)でデバッグを実行します。現在処理が止まっている行、すなわちブレークポイントを設定した一行目がハイライトされています。

変数ウィンドウにはこのPGで定義されている変数一覧が表示されています。この段階で一行目の処理は実行されていないため、変数はnilとなっています。

Step Over(F8)で処理を進めます。

ハイライトが次の行にうつりました。
この段階で一行目の処理は実行され、変数ウィンドウでは変数studentsの値が、ウォッチウィンドウではstudents.join(' ')の評価結果が確認できるようになっています。
またエディタのハイライトされている行には、現在の行で使用されている変数が表示されています。

Step Over(F8)で処理を進めます。

2行目の処理が実行されたことで、変数ウィンドウのupcase_studentsにも値が入りました。
もう一度Step Over(F8)をして、プログラムは終了です。

だいぶ簡単なプログラムでしたが、これより大きなRubyスクリプトでも、Railsプロジェクトでも基本は同じです。
まずは適当なブレークポイントを配置して、Step Overで進めていき、必要に応じてStep Intoやウォッチウィンドウを利用すると良いでしょう。


適切なブレークポイントを設定できるようになることは、バグ修正の高速化に繋がりますので、ぜひデバッグ機能を使ってみてください。