수색…


디버깅 레일 어플리케이션

응용 프로그램을 디버그 할 수 있으려면 응용 프로그램의 논리와 데이터의 흐름을 이해하는 것이 중요합니다. 논리적 인 버그를 해결하고 프로그래밍 경험과 코드 품질에 가치를 더합니다. 디버깅에 가장 많이 사용되는 두 가지 도구는 디버거 (루비 1.9.2와 1.9.3)와 byebug (루비> = 2.x)입니다.

.rb 파일을 디버깅하려면 다음과 같이하십시오.

  1. debugger 또는 byebugbyebug development 그룹에 Gemfile
  2. bundle install 실행
  3. debugger 또는 byebug 를 중단 점으로 추가하십시오.
  4. 코드를 실행하거나 요청하십시오.
  5. 지정된 중단 점에서 중지 된 레일 서버 로그보기
  6. 이 시점에서 rails console 처럼 서버 터미널을 사용할 수 있으며 변수 및 매개 변수의 값을 확인할 수 있습니다
  7. 다음 명령어로 이동하는 경우, 입력 한 next 키를 누릅니다 enter
  8. 형 스테핑의 경우 c 를 눌러 enter

.html.erb 파일을 디버깅 .html.erb 중단 점이 <% debugger %>

IDE에서 디버깅하기

좋은 IDE 는 모두 중단 점, 시계, 예외시 자동 일시 중지를 추가 할 수있는 Ruby (및 레일스) 응용 프로그램을 대화식으로 디버깅 할 수있는 GUI 를 제공하며 한 줄씩 단계별로 코드 실행을 따라갈 수 있습니다.

예를 들어 최고의 Ruby IDE, RubyMine의 디버깅 기능 중 하나를 살펴보십시오

여기에 이미지 설명을 입력하십시오.

Ruby on Rails를 빠르게 디버깅하기 + 초보자를위한 조언

예외를 발생시켜 디버깅하는 것은 print 로그 문을 통해 squinting하는 것보다 훨씬 쉽습니다. 대부분의 버그의 경우 일반적으로 pry 또는 byebug 와 같은 irb 디버거를 여는 보다 훨씬 빠릅니다 . 이러한 도구가 첫 번째 단계가되어서는 안됩니다.


Ruby / Rails를 빠르게 디버깅하기 :

1. 빠른 방법 : Exception.inspect 하고 그 결과를 조사하십시오.

가장 빠른 방법은 코드가하는 루비 (특히 레일)를 디버깅하는 raise 호출하는 동안 코드의 실행 경로를 따라 예외를 .inspect (예를 들어, 방법 또는 개체에 foo ) :

raise foo.inspect

위의 코드에서 raise코드 실행중단 시키는 Exception 을 발생 시키고 디버깅하려는 줄에있는 객체 / 메서드 (즉 foo )에 대한 .inspect 정보를 편리하게 포함하는 오류 메시지를 반환합니다.

이 기법은 객체 또는 메소드를 신속하게 검사하고 ( 예 : nil ) 코드의 라인이 주어진 상황에서 전혀 실행되지 않는지를 즉시 확인하는 데 유용합니다.

2. Fallback : byebugpry 와 같은 루비 IRB 디버거를 사용하십시오.

코드 실행 흐름의 상태에 대한 정보를 얻은 후에 만 pry 또는 byebug 와 같은 루비 보석 irb 디버거로 이동하여 실행 경로 내의 객체 상태를보다 깊이 파고들 수 있습니다.

Rails에서 디버깅을 위해 byebug gem을 사용하려면 다음을 수행하십시오.

  1. gem 'byebug'개발 그룹 안에 gem 'byebug' 추가하십시오 .
  2. bundle install 실행
  3. 그런 다음, 검사 할 코드의 실행 경로 안에 byebug 라는 구를 삽입하십시오.

byebug 변수가 실행되면 코드의 루비 IRB 세션이 열리 며 코드 실행 중 그 시점에있는 객체의 상태에 직접 액세스 할 수 있습니다.

Byebug와 같은 IRB 디버거는 실행되는 코드의 상태를 깊이있게 분석하는 데 유용합니다. 그러나 오류를 제기하는 것보다 시간이 많이 걸리는 프로 시저이므로 대부분의 상황에서 첫 단계가되어서는 안됩니다.


일반 초보자를위한 조언

문제를 디버깅 할 때 좋은 조언은 항상 다음과 같습니다 . @! $ # 오류 메시지 (RTFM)

즉, 행동하기 전에 오류 메시지를 주의 깊고 완전히 읽음으로써 사용자 에게 무엇을 말하려고하는지 이해하도록하십시오. 디버깅 할 때 오류 메시지를 읽을 때 다음 순서대로 질문하십시오.

  1. 오류를 참조하는 클래스 는 무엇입니까? (즉, 내가 올바른 개체 클래스가 또는 내 개체입니다하지 nil ?)
  2. 어떤 방법 으로 오류를 참조합니까? (즉 , 메서드의 형식입니다.이 형식 / 개체 클래스에서이 메서드를 호출 할 수 있습니까? )
  3. 마지막으로, 마지막 두 질문에서 추측 할 수있는 것을 사용하여 어떤 코드 행을 조사해야합니까? (기억해 : 스택 추적 코드의 마지막 줄은 반드시 문제가있는 곳이 아닙니다.)

스택 추적에서 프로젝트에서 오는 코드 행에 특히주의하십시오 (예 : Rails를 사용하는 경우 app/... 시작하는 행). 자신의 코드에 문제가있는 시간의 99 %.


이 순서대로 해석 하는 것이 중요한 이유를 설명 하기 위해 ...

예 : 많은 초보자를 혼란시키는 Ruby 오류 메시지 :

어떤 시점에서 다음과 같이 실행되는 코드를 실행합니다.

@foo = Foo.new

...

@foo.bar

그리고 당신은 다음과 같은 오류 메시지를 받게됩니다 :

undefined method "bar" for Nil:nilClass

초보자는이 오류를보고 방법 bar정의되지 않았다고 문제가 있다고 생각합니다. 그렇지 않습니다. 이 오류에서 중요한 부분은 다음과 같습니다.

for Nil:nilClass

for Nil:nilClass@foo 가 Nil for Nil:nilClass 의미합니다! @fooFoo 인스턴스 변수가 아닙니다! 당신은 Nil 이라는 객체를 가지고 있습니다. 이 에러를 보았을 때, 루비는 Nil 클래스의 객체에 대해 메소드 bar 가 존재하지 않는다는 것을 알려주려고합니다. (음, Foo 클래스의 객체에 대해 Nil 아닌 메소드를 사용하려고하기 때문에).

불행하게도,이 오류가 (작성 방법에 의한 undefined method "bar" for Nil:nilClass ) 쉬운이 오류를 생각하면 함께 할 수있다 속아서하세요 bar 있는 undefined . 주의 깊게 읽지 않으면이 오류로 인해 초보자가 실수로 Foobar 메서드에 대한 세부 정보를 파헤 Foo 객체가 잘못된 클래스임을 나타내는 오류 부분을 완전히 누락하게됩니다 (이 경우 nil). 오류 메시지 전체를 읽음으로써 쉽게 피할 수있는 오류입니다.

개요:

디버깅을 시작하기 전에 항상 전체 오류 메시지 를주의 깊게 읽으십시오 . 그 의미 : 당신이 어떤 스택 트레이스 또는 코드의 라인으로 뒤를 쫓고을 시작하기 전에 오류가 발생 될 수 있습니다 생각하는 경우 항상 다음, 먼저 방법을 오류 메시지에서 개체의 클래스 유형을 확인. 5 초는 5 시간의 좌절감을 덜어줍니다.

tl; dr : 인쇄 로그를 보지 말고 예외를 발생 시키십시오. 디버깅하기 전에 오류를주의 깊게 읽음으로써 토끼의 구멍을 피하십시오.

pry와 함께 ruby-on-rails 응용 프로그램 디버깅

pry 는 루비 응용 프로그램을 디버그하는 데 사용할 수있는 강력한 도구입니다. 이 보석으로 루비 온 레일 애플리케이션을 설정하는 것은 매우 쉽고 간단합니다.

설정

pry로 응용 프로그램 디버깅을 시작하려면

  • 응용 프로그램의 Gemfile gem 'pry' 를 추가하고 번들하십시오.
group :development, :test do
  gem 'pry'
end
  • 터미널 콘솔에서 응용 프로그램의 루트 디렉토리로 이동하고 bundle install 실행 bundle install . 응용 프로그램의 어느 곳에서나 사용할 수 있습니다.

용도

응용 프로그램에서 pry를 사용하는 것은 디버깅하는 동안 검사 할 중단 점에 binding.pry 를 포함하는 것입니다. Ruby 인터프리터 (모든 app / controllers, app / models, app / views 파일)로 해석되는 응용 프로그램에서 binding.pry 중단 점을 추가 할 수 있습니다.

i) 컨트롤러 디버깅

app / controllers / users_controller.rb

class UsersController < ApplicationController
  def show
    use_id = params[:id]
    // breakpoint to inspect if the action is receiving param as expected
    binding.pry
    @user = User.find(user_id)
    respond_to do |format|
      format.html
    end
  end
end

이 예제에서 레일즈 서버는 페이지 라우팅을 방문하여 UsersController 작업을 show 하려고 할 때 브레이크 포인트에서 콘솔을 사용하여 일시 중지합니다. params 객체를 검사하고 해당 중단 점에서 User 모델에 대한 ActiveRecord 쿼리를 만들 수 있습니다.

ii)보기 디버깅

app / views / users / show.html.haml

%table
  %tbody
    %tr
      %td ID
      %td= @user.id
    %tr
      %td email
      %td= @user.email
    %tr
      %td logged in ?          
      %td
        - binding.pry
        - if @user.logged_in?
          %p= "Logged in"
        - else
          %p= "Logged out"

이 예에서, users/show 페이지가 레일즈 서버에서 미리 컴파일되어 클라이언트의 브라우저로 다시 보내기 전에 브레이크 포인트는 콘솔을 사용하여 일시 정지합니다. 이 중단 점은 @user.logged_in? 정확성을 디버깅 할 수 @user.logged_in? 잘못했을 때.

ii) 모델 디버깅

app/models/user.rb

class User < ActiveRecord::Base    
  def full_name
    binding.pry
    "#{self.first_name} #{self.last_name}"
  end      
end

이 예제에서 응용 프로그램의 어느 위치에서든이 메서드를 호출하면 User 모델의 인스턴스 메서드 full_name 을 디버깅하는 데 중단 점을 사용할 수 있습니다.

결론적으로, pry는 손쉬운 설정과 간단한 디버깅 지침을 사용하여 레일 어플리케이션을위한 강력한 디버깅 도구입니다. 이것을 시도하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow