CSC/ECE 517 Fall 2014/ch1a 26 sn

From Expertiza_Wiki
Jump to navigation Jump to search

Debugging in Rails using Pry

Debugging is a process of finding and reducing the bugs or defects in a computer program thereby making it behave as expected. Few of the debugging techniques are Print debugging (also known as printf debugging), Log debugging and Interactive debugging. Rails provides a range of options to make debugging easier which include debug helpers, loggers, graphical debuggers, Pry, and so on. In the following sections, we would be discussing about debugging in Rails using Pry.

Introduction to Pry debugger

Pry is an interactive shell for the Ruby programming language. Pry could be started at any point within a running program. Due to this, programmers can inspect the program, correct the source code, or change its current state without having to restart the process. Pry is thus notable for its ability to start a REPL within a running program.

Pry has the following features that make it extremely efficient to use:

  • View a document or source for a method: The show-doc method gives you information regarding the method and to take a quick look at the source, there's also the show-method method.
  • Search your Pry history: Pry's hist --grep makes it easy to search through your Pry history.

To start a debugging session, you need to include the require 'pry' and binding.pry lines in your program that needs to be debugged. You could insert the line binding.pry at any point in your program. Whenever the Ruby interpreter executes this line, it opens a Pry REPL session. The code after the binding.pry statement is not executed unless instructed by the programmer. We could make changes to fix the code and then return to running program from same point.

Installation

To use Pry for debugging a Rails application, you first need to download and install Pry-debugger. If you are using Ruby version 2.0 or higher, then download pry-debugger from here. If you are using Ruby version 1.9 or lower, then download pry-debugger from here.

To install the debugger use the following command:

gem install pry-debugger.gem

Include the following line of code on the gem file:

gem 'pry-rails', :group => :development

Once that is done, the necessary dependencies could be installed using the following command:

$bundle install

Commands

To use the execution command, invoke pry normally. There is no need to start your script or application differently. For the sake of clarity in explanation, we would refer to the program below:

require 'pry'
def method1 (seller)
	puts 'Inside method 1'
	method2(seller)
  end

def method2(seller)
  binding.pry      	# Execution will stop here.
  new_products = method3(seller)
  puts 'After calling method3'
end

def method3(seller)
	puts 'Inside method 3'
	puts 'Continuing in method 3'
end

method1('xyz')

The Step command:

The Step command continues execution by moving into the method on the next line. To put it in another way, the command takes us deeper into the method. Following our example, the step command would take us into 'method3' at which point we would be asked what to do next.

The Next command:

The next command runs the current line and moves to the next line in the current context. If the next line in the code is a method call, then unlike the 'step' method the execution does not go deeper into the method. Following our example, if we execute the above code, the execution stop at the 'binding.pry' line and the debugger asks us for the further action. On using the 'next' command, the execution moves to the next line that is ' new_products = method3(seller)' without going deeper into the method. All the code within the 'method3' method (which would otherwise be many steps), has been concluded with a single use of the 'next' command.

The Finish command:

Now once we have stepped into a method using the 'step' command, the debugger would ask us what needs to be done next. Now if we want to jump to the end of the method without the debugger asking us our choice of navigation command at the end of each line, we could use the 'finish' command. The finish command would execute the code in the method and return back to the point from where the method was called. In our example, while the debugger is in method3, the finish command would complete the code execution in method3 and return back to method2.

The Continue command:

With this command we can abandon the pry session and continue the normal execution of the program. If the interpreter encounters another 'binding.pry', a pry session is again opened. This can be incredibly annoying, since our program will stop and we’ll have to navigate the debugger every single time, so we’ll probably want to type exit-program to cancel the effect of any following binding.pry statements, thereby exiting our rails application.

Reference