1分でわかるbyebugの使い方
# お題
ここに間違ったFizzBuzzのプログラムがあります(fizz_bug.rb)
1.upto(30).each do |num|
if num % 15 == 0
puts "FizzBuzz"
next
elsif num % 5 == 0
puts "Buzz"
elsif num % 3 == 0
puts "Fizz"
end
puts num
endこれをbyebugでデバッギングする仕方を説明します。
結果(間違ってます)
1
2
Fizz
3
4
Buzz
5
Fizz
6
7
8
Fizz
9
Buzz
10
11
Fizz
12
13
14
FizzBuzz
16
17
Fizz
18
19
Buzz
20
Fizz
21
22
23
Fizz
24
Buzz
25
26
Fizz
27
28
29
FizzBuzz
どうやら、Fizzのあとと、Buzzのあとに余計な数字が出力されています。困った。
byebugとは
https://github.com/deivid-rodriguez/byebug
rubyで使えるデバッガです。
CLIのコマンドも用意されているのですが、byebugライブラリをrequireすると使えるようになるdebuggerメソッドのほうが使いやすいので、この方法を説明します。
インストール
byebugを使うためにはgem installがいります。 (bundlerなどですでに入っているディレクトリだったら要りません)
gem install byebug
プログラムを途中で止める
byebugをrequireします
require 'byebug' # ここ追加
1.upto(30).each do |num|
if num % 15 == 0
puts "FizzBuzz"
next
elsif num % 5 == 0
puts "Buzz"
elsif num % 3 == 0
puts "Fizz"
end
puts num
end止めたいところでdebuggerと書きます
require 'byebug'
1.upto(100).each do |num|
if num % 15 == 0
puts "FizzBuzz"
next
elsif num % 5 == 0
puts "Buzz"
debugger # ここ追加
elsif num % 3 == 0
puts "Fizz"
end
puts num
endruby fizz_bug.rb
➜ Desktop ruby fizz_bug.rb
1
2
Fizz
3
4
Buzz
[6, 15] in /Users/user/Desktop/fizz_bug.rb
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
15: endプログラムが止まりました。
8行目のputs "Buzz"が実行されたのでBuzzが表示されています。
本当はここで次のイテレーションを実施したいのですが、Buzzのあとに5と表示されてしまっているので、間違ってしまっているみたいです。
ステップ実行してみます
ステップ実行
nと入力してください。次の行だけ実行できます。
(byebug) n
5
[1, 10] in /Users/user/Desktop/fizz_bug.rb
1: require 'byebug'
2:
3: 1.upto(30).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
(byebug)どうやら14行目のputs nが実行されて、次のイテレーションに移ってしまったみたいです。
どうやらnextし忘れたみたいです。
次のdebuggerまで処理をつづける
原因がわかったので、次のループまで飛ばします
cと入力します。
(byebug) c
Fizz
6
7
8
Fizz
9
Buzz
[6, 15] in /Users/user/Desktop/fizz_bug.rb
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
15: end
(byebug)
cを押すと、次にdebuggerが仕込まれているところまで処理を実行します。
デバッグをやめる
もう原因がわかっているので、終了します。
(byebug) exit
➜ Desktop
完成版
Fizzのあともバグってたので直します。
require 'byebug'
1.upto(30).each do |n|
if num % 15 == 0
puts "FizzBuzz"
next
elsif num % 5 == 0
puts "Buzz"
next
elsif num % 3 == 0
puts "Fizz"
next
end
puts num
endということで完成です。