Ruby on Rails
디버깅
수색…
디버깅 레일 어플리케이션
응용 프로그램을 디버그 할 수 있으려면 응용 프로그램의 논리와 데이터의 흐름을 이해하는 것이 중요합니다. 논리적 인 버그를 해결하고 프로그래밍 경험과 코드 품질에 가치를 더합니다. 디버깅에 가장 많이 사용되는 두 가지 도구는 디버거 (루비 1.9.2와 1.9.3)와 byebug (루비> = 2.x)입니다.
.rb
파일을 디버깅하려면 다음과 같이하십시오.
-
debugger
또는byebug
를byebug
development
그룹에Gemfile
-
bundle install
실행 -
debugger
또는byebug
를 중단 점으로 추가하십시오. - 코드를 실행하거나 요청하십시오.
- 지정된 중단 점에서 중지 된 레일 서버 로그보기
- 이 시점에서
rails console
처럼 서버 터미널을 사용할 수 있으며 변수 및 매개 변수의 값을 확인할 수 있습니다 - 다음 명령어로 이동하는 경우, 입력 한
next
키를 누릅니다enter
- 형 스테핑의 경우
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 : byebug
나 pry
와 같은 루비 IRB 디버거를 사용하십시오.
코드 실행 흐름의 상태에 대한 정보를 얻은 후에 만 pry
또는 byebug
와 같은 루비 보석 irb 디버거로 이동하여 실행 경로 내의 객체 상태를보다 깊이 파고들 수 있습니다.
Rails에서 디버깅을 위해 byebug
gem을 사용하려면 다음을 수행하십시오.
-
gem 'byebug'
의 개발 그룹 안에gem 'byebug'
추가하십시오 . -
bundle install
실행 - 그런 다음, 검사 할 코드의 실행 경로 안에
byebug
라는 구를 삽입하십시오.
이 byebug
변수가 실행되면 코드의 루비 IRB 세션이 열리 며 코드 실행 중 그 시점에있는 객체의 상태에 직접 액세스 할 수 있습니다.
Byebug와 같은 IRB 디버거는 실행되는 코드의 상태를 깊이있게 분석하는 데 유용합니다. 그러나 오류를 제기하는 것보다 시간이 많이 걸리는 프로 시저이므로 대부분의 상황에서 첫 단계가되어서는 안됩니다.
일반 초보자를위한 조언
문제를 디버깅 할 때 좋은 조언은 항상 다음과 같습니다 . @! $ # 오류 메시지 (RTFM)
즉, 행동하기 전에 오류 메시지를 주의 깊고 완전히 읽음으로써 사용자 에게 무엇을 말하려고하는지 이해하도록하십시오. 디버깅 할 때 오류 메시지를 읽을 때 다음 순서대로 질문하십시오.
- 오류를 참조하는 클래스 는 무엇입니까? (즉, 내가 올바른 개체 클래스가 또는 내 개체입니다하지
nil
?) - 어떤 방법 으로 오류를 참조합니까? (즉 , 메서드의 형식입니다.이 형식 / 개체 클래스에서이 메서드를 호출 할 수 있습니까? )
- 마지막으로, 마지막 두 질문에서 추측 할 수있는 것을 사용하여 어떤 코드 행을 조사해야합니까? (기억해 : 스택 추적 코드의 마지막 줄은 반드시 문제가있는 곳이 아닙니다.)
스택 추적에서 프로젝트에서 오는 코드 행에 특히주의하십시오 (예 : 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
의미합니다! @foo
는 Foo
인스턴스 변수가 아닙니다! 당신은 Nil
이라는 객체를 가지고 있습니다. 이 에러를 보았을 때, 루비는 Nil
클래스의 객체에 대해 메소드 bar
가 존재하지 않는다는 것을 알려주려고합니다. (음, Foo
클래스의 객체에 대해 Nil
아닌 메소드를 사용하려고하기 때문에).
불행하게도,이 오류가 (작성 방법에 의한 undefined method "bar" for Nil:nilClass
) 쉬운이 오류를 생각하면 함께 할 수있다 속아서하세요 bar
있는 undefined
. 주의 깊게 읽지 않으면이 오류로 인해 초보자가 실수로 Foo
의 bar
메서드에 대한 세부 정보를 파헤 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는 손쉬운 설정과 간단한 디버깅 지침을 사용하여 레일 어플리케이션을위한 강력한 디버깅 도구입니다. 이것을 시도하십시오.