Back to Blog

Rails 7 replaced byebug with ruby/debug

on November 9, 2021
This blog is part of our Rails 7 series.

Rails 5 introduced byebug which is an easy-to-use, feature-rich ruby debugger. It offers features like Stepping, Breaking, Evaluating, Tracking.

Using byebug we can easily control the execution of a program and the debug inspector for call stack navigation. This allows us to handle and track the execution flow.

Here is byebug documentation and here is the pull request where it was added.

Rails 7 is replacing byebug with ruby/debug. debug is Ruby’s new debugger which will be included in Ruby 3.1. To align Rails with Ruby debug has been added to Rails 7.

Let's see an example of debugging with both Byebug and Debug.

Before

Let's assume we have a NameController. Inside any Rails application, you can call the debugger by calling the byebug method.

1# app/controllers/name_controller.rb
2class NameController < ApplicationController
3  def index
4    name = "John Doe"
5    byebug # Call to debugger
6    city = "San Francisco"
7  end
8end

Then The invoked debugger results in the following.

1    [1, 7] in app/controllers/test_controller.rb
2    1: class NameController < ApplicationController
3    2:   def index
4    3:     name = "John Doe"
5    4:     byebug # Call to debugger
6=>  5:    city = "San Francisco"
7    6:   end
8    7: end
9
10  (byebug) name # variable call
11  "John Doe"

Rails 7 onwards

We can use the binding.break method for calling Ruby Debug.

1# app/controllers/name_controller.rb
2class NameController < ApplicationController
3  def index
4    name = "John Doe"
5    binding.break # Call to debugger
6    city = "San Francisco"
7  end
8end

The invoked debugger results in the following.

1  [1, 7] in app/controllers/test_controller.rb
2  1| class NameController < ApplicationController
3  2|   def index
4  3|     name = "John Doe"
5  4|     binding.break # Call to debugger
6> 5|    city = "San Francisco"
7  6|   end
8  7| end
9>#0 NameController#index at ~/demo_app/app/controllers/name_controller.rb:5
10  #1  ActionController::BasicImplicitRender#send_action(method="index", args=[])
11(rdbg) name # variable call
12"John Doe"

Check out this pull request for more details and for commands or features of Ruby Debug, please visit Ruby-Debug.