Rails Study(14)Debugging Rails Applications

阅读更多
Rails Study(14)Debugging Rails Applications

1. View Helpers for Debugging
To inspect the contents of a variable. We have 3 ways:
debug
to_yaml
inspect

1.1 debug
if we have this kind of code in a view:
<%= debug @post %>


  Title:
  <%=h @post.title %>



I will see something like this:
--- !ruby/object:Post
attributes:
updated_at: 2008-09-05
body:..
title: Rails debuging guide

1.2 to_yaml
<%= simple_format @post.to_yaml %>


  Title:
  <%=h @post.title %>



The to_yaml method converts the method to YAML format leaving it more readable, and then the simple_format helper is used to render each line as in the console.
--- !ruby/object:Post
attributes:
updated_at: 2008

1.3 inspect
It will print the object value as a string when working with arrays or hashes.
<%= [1,2,3,4,5].inspect %>


  Title:
  <%=h @post.title %>



1.4 Debugging RJS
The flag to enable RJS debugging in your configuration files is config.action_view.debug_rjs:
config.action_view.debug_rjs = true

or set this at any time
ActionView::Base.debug_rjs = true

2. The Logger
Rails maintains a separate log file for each runtime environment.

2.1 What is the Logger?
In evnrionment.rb
Rails.logger = Logger.new(STDOUT)
Rails.logger = Log4r::Logger.new("Application Log")

By default, each log is created under Rails.root/log/ and the log file name is environment_name.log.

2.2 Log Levels
If you want to know the current log level you can call the Rails.logger.level method.

The available log levels are: :debug, :info, :warn, :error, and :fatal. To change the default log level, use
config.log_level = Logger::WARN #In any environment initializer, or
Rails.logger.level = 0 #at any time

2.3 Sending Messages
To write message in logger.

logger.debug "Person attributes hash: #{@person.attributes.inspect}"
logger.info "Processing the request..."
logger.fatal "terminating application!!!"

3 Debugging with ruby-debug
3.1 Setup
>gem install ruby-debug
error messages:
ERROR:  Error installing ruby-debug:
        rbx-require-relative requires Ruby version ~> 1.8.7.
solutions:
>gem install ruby-debug19
add this to Gemfile
ruby-debug19

Inside any Rails application you can invoke the debugger by calling the debugger method. For example:
class PeopleController < ApplicationController
def new
  debugger
  @person = Person.new
end
end

if you see the message like this:
***** Debugger requested, but was not available: Start server with --debugger to enable *****
That is not right, you need to start your application like this:
>rails server --debugger

3.2 The Shell
(rdb:7) help ---- show the help information

(rdb:7) list ------- list where we are about the codes

(rdb:7) l ----------- list the below lines in the codes

3.3 The Context
3.4 Threads
3.5 Inspecting Variables
Any expression can be evaluated in the current context. To evaluate an expression, just type it!

@posts = Post.find(:all)
(rdb:11) instance_variables
>(rdb:11) instance_variables.include? "@posts"

>(rdb:1) display @recent_comments

3.6 Step by Step
The difference between next and step is that step stops at the next line of code executed, doing just a single step, while next moves to the next line without descending inside methods. For example:
class Author < ActiveRecord::Base
has_one :editorial
has_many :comments

def find_recent_comments(limit = 10)
  debugger
  @recent_comments ||= comments.find(
    :all,
    :conditions => [ "created_at > ?", 1.week.ago],
    :limit => limit
  )
end
end

>rails console
>> require "ruby-debug"
>> (rdb:1) list
>> (rdb:1) var instance
>> (rdb:1) next

3.7 Breakpoints
3.8 Catching Exceptions
3.9 Resuming Excecution
3.10 Editing
3.11 Quitting
3.12 Settings

4 Debugging Memory Leaks
4.1 BleakHouse
BleakHouse is a library for finding memory leaks.
>gem install bleak_house
error messages:
ERROR:  Error installing bleak_house:
        ERROR: Failed to build gem native extension.

        d:/tool/Ruby192/bin/ruby.exe extconf.rb
-%{ BUILDING RUBY }%-
build_ruby.rb:33:in `chdir': No such file or directory - /tmp/ (Errno::ENOENT)
        from build_ruby.rb:33:in `
'
solutions:
do not try to install this on win7, try on redhat or ubuntu.

To setup my applicatiion for profiling, add the following at the bottom of config/environment.rb
require 'bleak_house' if ENV['BLEAK_HOUSE']

start server like this:
>RAILS_ENV=production BLEAK_HOUSE=1 ruby-bleak-house rails server

Make sure to run a couple hundred requests to get better data samples. Press CTRL-C and the bleak house will produce a dumpfile in /tmp:

4.2 Valgrind
Valgrind is a Linux-only application for detecting C-based memory leaks and race conditions.

5 Plugins for Debugging

references:
http://guides.rubyonrails.org/debugging_rails_applications.html
http://www.tatvartha.com/2011/08/upgrading-to-ruby-1-9-rbx-require-relative-requires-ruby-version-1-8-7/

你可能感兴趣的:(debugging,ruby,rails)