1分でわかるbyebugの使い方

公開日: 2018年5月22日GitHub

# お題

ここに間違ったFizzBuzzのプログラムがあります(fizz_bug.rb)

11.upto(30).each do |num|
2 if num % 15 == 0
3 puts "FizzBuzz"
4 next
5 elsif num % 5 == 0
6 puts "Buzz"
7 elsif num % 3 == 0
8 puts "Fizz"
9 end
10
11 puts num
12end
13

これをbyebugでデバッギングする仕方を説明します。

結果(間違ってます)

11
22
3Fizz
43
54
6Buzz
75
8Fizz
96
107
118
12Fizz
139
14Buzz
1510
1611
17Fizz
1812
1913
2014
21FizzBuzz
2216
2317
24Fizz
2518
2619
27Buzz
2820
29Fizz
3021
3122
3223
33Fizz
3424
35Buzz
3625
3726
38Fizz
3927
4028
4129
42FizzBuzz
43

どうやら、Fizzのあとと、Buzzのあとに余計な数字が出力されています。困った。

byebugとは

https://github.com/deivid-rodriguez/byebug

rubyで使えるデバッガです。 CLIのコマンドも用意されているのですが、byebugライブラリをrequireすると使えるようになるdebuggerメソッドのほうが使いやすいので、この方法を説明します。

インストール

byebugを使うためにはgem installがいります。 (bundlerなどですでに入っているディレクトリだったら要りません)

1gem install byebug
2

プログラムを途中で止める

byebugをrequireします

1require 'byebug' # ここ追加
2
31.upto(30).each do |num|
4 if num % 15 == 0
5 puts "FizzBuzz"
6 next
7 elsif num % 5 == 0
8 puts "Buzz"
9 elsif num % 3 == 0
10 puts "Fizz"
11 end
12
13 puts num
14end
15

止めたいところでdebuggerと書きます

1require 'byebug'
2
31.upto(100).each do |num|
4 if num % 15 == 0
5 puts "FizzBuzz"
6 next
7 elsif num % 5 == 0
8 puts "Buzz"
9 debugger # ここ追加
10 elsif num % 3 == 0
11 puts "Fizz"
12 end
13
14 puts num
15end
16

ruby fizz_bug.rb

1Desktop ruby fizz_bug.rb
21
32
4Fizz
53
64
7Buzz
8
9[6, 15] in /Users/user/Desktop/fizz_bug.rb
10 6: next
11 7: elsif num % 5 == 0
12 8: puts "Buzz"
13 9: debugger
14 10: elsif num % 3 == 0
15 11: puts "Fizz"
16 12: end
17 13:
18=> 14: puts num
19 15: end
20

プログラムが止まりました。 8行目のputs "Buzz"が実行されたのでBuzzが表示されています。

本当はここで次のイテレーションを実施したいのですが、Buzzのあとに5と表示されてしまっているので、間違ってしまっているみたいです。

ステップ実行してみます

ステップ実行

nと入力してください。次の行だけ実行できます。

1(byebug) n
25
3
4[1, 10] in /Users/user/Desktop/fizz_bug.rb
5 1: require 'byebug'
6 2:
7 3: 1.upto(30).each do |num|
8=> 4: if num % 15 == 0
9 5: puts "FizzBuzz"
10 6: next
11 7: elsif num % 5 == 0
12 8: puts "Buzz"
13 9: debugger
14 10: elsif num % 3 == 0
15(byebug)
16

どうやら14行目のputs nが実行されて、次のイテレーションに移ってしまったみたいです。 どうやらnextし忘れたみたいです。

次のdebuggerまで処理をつづける

原因がわかったので、次のループまで飛ばします

cと入力します。

1(byebug) c
2Fizz
36
47
58
6Fizz
79
8Buzz
9
10[6, 15] in /Users/user/Desktop/fizz_bug.rb
11 6: next
12 7: elsif num % 5 == 0
13 8: puts "Buzz"
14 9: debugger
15 10: elsif num % 3 == 0
16 11: puts "Fizz"
17 12: end
18 13:
19=> 14: puts num
20 15: end
21(byebug)
22
23

cを押すと、次にdebuggerが仕込まれているところまで処理を実行します。

デバッグをやめる

もう原因がわかっているので、終了します。

1(byebug) exit
2➜ Desktop
3

完成版

Fizzのあともバグってたので直します。

1require 'byebug'
2
31.upto(30).each do |n|
4 if num % 15 == 0
5 puts "FizzBuzz"
6 next
7 elsif num % 5 == 0
8 puts "Buzz"
9 next
10 elsif num % 3 == 0
11 puts "Fizz"
12 next
13 end
14
15 puts num
16end
17

ということで完成です。

This site uses Google Analytics.
source code