Rubyにおけるデバッグ

プログラムの間違い(バグという)を見つけて正しく修正する作業のことをデバッグという。

デバッグに役立つ方法を以下に挙げる。

printデバッグ

プログラムの途中の適切なところで p メソッドや printf メソッドで変数を出力するよう埋め込んでおくと変数の中身の変化を見ることができ、自分が意図した動きになっているか確認しやすくなる。

デバッグが終わったらデバッグ用の p メソッドや printf メソッドは削除するか「#」でコメント化しておくこと。

Byebug

Byebug というデバッガを利用すると print デバッグよりも機能的にデバッグを行うことができる。


Byebugのインストール

Byebug を利用するには、はじめにシェルで次のように gem コマンドを実行して Byebug をインストールする必要がある。

% gem install byebug

少し時間がかかるが、最後に

1 gem installed

と表示されればインストールは成功である。

インストールされているかは次のコマンドで確認できる。

% rehash
% byebug -v
 
  Running byebug 11.1.3

大学の環境だと roy でインストールできる。


Byebugの利用方法

プログラムを実行する際に byebug というコマンドから実行する。

% byebug ファイル名

プログラム実行が一時中断し、プロンプト「(byebug)」でコマンド入力待ちとなるので、各種コマンドでデバッグを行う。 Enter キーを押すと直前のコマンドを繰り返す。

よく使うコマンドを以下に挙げる。

コマンド 短縮コマンド 機能
help h ヘルプを表示する。
quit q 実行を中断して終了する。
next n 一行実行して中断するが、関数やブロックの中だとそれが終わるところまで実行して中断する(ステップオーバー)。
step s 一行実行して中断する(ステップイン)。
contiune c プログラムを最後まで実行する。ブレークポイントがあればそこで中断する。
finish fin 現在のメソッドを最後まで実行し、呼び出し元のメソッドに戻って中断する(ステップアウト)。
list l ソースコードを表示する。
p 変数名 変数の中身を表示する。
var local v l ローカル変数の一覧を表示する。
break 行番号 b 行番号 行番号で指定した行にブレークポイントを設定する。
info breakpoint i b 設定したブレークポイント一覧を表示する。
delete 番号 del 番号 設定したブレークポイントを削除する。番号を省略するとすべてのブレークポイントを削除する。

ブレークポイントとは実行を中断させたい場所のことで、少しずつでなくその場所まで一気に実行させたい場合に使用する。

例えば次のプログラム loopint.rb を実行してみよう。

loopint.rb
  1. #!/usr/koeki/bin/ruby
  2. # -*- coding: utf-8 -*-
  3.  
  4. x = 5
  5.  
  6. # 0 から x-1 まで 1 ずつ増やした整数を順に y に代入して処理
  7. print "times :"
  8. x.times do |y|
  9. printf(" %d", y)
  10. end
  11. print "\n"
  12.  
  13. # x から 10 まで 1 ずつ増やした整数を順に y に代入して処理
  14. print "upto :"
  15. x.upto(10) do |y|
  16. printf(" %d", y)
  17. end
  18. print "\n"
  19.  
  20. # x から 2 まで 1 ずつ減らした整数を順に y に代入して処理
  21. print "downto:"
  22. x.downto(2) do |y|
  23. printf(" %d", y)
  24. end
  25. print "\n"

実行結果

% byebug loopint.rb
 
[1, 10] in loopint.rb
    1: #!/usr/koeki/bin/ruby
    2: # -*- coding: utf-8 -*-
    3:
=>  4: x = 5
    5:
    6: # 0 から x-1 まで 1 ずつ増やした整数を順に y に代入して処理
    7: print "times :"
    8: x.times do |y|
    9:   printf(" %d", y)
   10: end
(byebug)

=>」のある行(この場合だと4行目)は次に実行される行を示している。

コマンド step か next を入力すると一行実行して一時中断する(空行やコメント行はスキップする)。