답변:
다음을 통해 설치하십시오.
$ gem install pry
$ pry
그런 다음 다음을 추가하십시오.
require 'pry'; binding.pry
당신의 프로그램으로.
현재 pry
0.12.2 그러나, 네비게이션 등의 명령하지있다 next
, break
다른 어떤 보석이 별도로 제공 등이 예를 들면 참조 pry-byedebug
.
binding.pry
. 또한 색상 완성, 문서 조회 및 메소드를 동적으로 편집 및 다시로드 할 수있는 가능성도 제공됩니다.
Pry
/ byebug
훌륭하지만 디버깅 할 때 첫 번째 단계는 아닙니다. 대부분의 경우 예외를 발생 raise object.inspect
시키면 irb 세션을 여는 것보다 문제가 더 빨리 해결됩니다. 예외 발생과 같은 간단한 솔루션으로 문제를 해결할 수없는 콘솔 디버거 만 사용하는 것이 좋습니다.
pry
있습니까? 나는 그것을하는 방법을 찾을 수 없었다. 그것이 내가 디버거에 기대하는 것입니다.
루비에서 :
ruby -rdebug myscript.rb
그때,
b <line>
: 중단 점을 넣습니다 n(ext)
또는 s(tep)
및c(ontinue)
p(uts)
디스플레이 용(펄 디버그와 같은)
Rails에서 :
script/server --debugger
및 추가 debugger
코드에서.
-r debug
쓰레기 라고 말 합니까?
facets
보석 요구 사항 의 특정 버전으로 Rails 2.2 앱에서 실행할 고대 버전의 Pry를 찾으려고 한 시간이 걸렸지 만 실패했습니다. 고대 Rails 앱의 ruby-debug
경우 다소 불쾌하지만 작업이 완료됩니다.
난간 권장 : pry를 사용하십시오! 나는 이것에 대해서만 동의 할 수 있습니다.
pry는 irb보다 훨씬 좋습니다.
당신은 추가해야합니다
require 'pry'
소스 파일에 추가하고 추가하여 소스 코드에 중단 점을 삽입하십시오.
binding.pry
사물을 보려는 곳에서 (이것은 고전적인 IDE 환경에서 중단 점을 트리거하는 것과 같습니다)
프로그램이
binding.pry
라인을 사용하면 프로그램의 모든 컨텍스트를 바로 사용할 수있는 pry repl에 바로 들어갈 수 있으므로 모든 것을 탐색하고 모든 객체를 조사하고 상태를 변경하며 코드를 즉시 변경할 수도 있습니다.
현재 사용중인 메소드의 코드를 변경할 수 없으므로 슬프게도 다음 줄을 변경할 수 없습니다. 그러나 좋은 루비 코드는 어쨌든 한 줄인 경향이 있습니다 ;-)
예외를 제기하여 디버깅하는 것은로그 문을통해 가늘게 뜨는 것보다 훨씬 쉽고print
대부분의 버그의 경우 일반적으로또는같은 irb 디버거를 여는 것 보다 훨씬 빠릅니다 . 이러한 도구가 항상 첫 번째 단계는 아닙니다.pry
byebug
Exception
그때와 .inspect
그 결과를 올립니다Ruby (특히 Rails) 코드를 디버깅 하는 가장 빠른 방법 은 메소드 또는 객체 (예 raise
:)를 호출 .inspect
하는 동안 코드의 실행 경로를 따라 예외를 처리하는 것입니다 foo
.
raise foo.inspect
위의 코드에서 코드의 실행 을 중지시키는를raise
트리거하고 디버그하려는 행 의 객체 / 방법 (예 :)에 대한 정보가 포함 된 오류 메시지를 반환합니다 . Exception
.inspect
foo
이 기법은 객체 나 메소드 를 신속하게 검사하고 ( 예 : nil
? ) 주어진 라인 내에서 코드 라인이 실행되고 있는지 즉시 확인 하는 데 유용합니다 .
byebug
pry
코드 실행 흐름의 상태에 대한 정보를 얻은 후에 만 루비 젬 irb 디버거로 이동 pry
하거나 byebug
실행 경로 내의 객체 상태를 더 깊이 파고들 수있는 곳을 고려해야 합니다.
문제를 디버깅하려고 할 때는 항상 다음과 같이하는 것이 좋습니다 .! @ # $ ing 오류 메시지 (RTFM)
오류 메시지를 읽고 의미 신중 하고 완전히 당신이 그렇게 행동하기 전에 당신을 말하려고 무엇을 이해합니다. 디버깅 할 때 오류 메시지를 읽을 때 다음과 같은 정신적 인 질문 을이 순서대로 수행하십시오 .
nil
있습니까 아니면 내 객체 입니까? ) 스택 추적에서 프로젝트에서 나오는 코드 줄 (예 : app/...
Rails를 사용 하는 경우 시작하는 줄)에 특히주의하십시오 . 99 %의 시간이 자신의 코드에 문제가 있습니다.
이 순서대로 해석 하는 것이 중요한 이유를 설명 하기 위해 ...
어떤 시점에서 다음과 같이 실행되는 코드를 실행합니다.
@foo = Foo.new
...
@foo.bar
다음과 같은 오류가 발생합니다.
undefined method "bar" for Nil:nilClass
초보자는이 오류를보고 문제가 메소드 bar
가 정의되어 있지 않다고 생각합니다 . 그렇지 않습니다. 이 오류에서 중요한 부분은 다음과 같습니다.
for Nil:nilClass
for Nil:nilClass
그 의미 @foo
는 Nil입니다! 인스턴스 변수 @foo
가 아닙니다 Foo
! 의 객체가 Nil
있습니다. 이 오류가 표시되면 단순히 bar
클래스의 객체에 대해 메소드 가 존재하지 않는다는 것을 나타내는 루비 Nil
입니다. (잘 모르겠습니다! 클래스가 Foo
아닌 객체의 메소드를 사용하려고 시도했기 때문에 Nil
).
불행히도,이 오류가 어떻게 작성되는지 ( undefined method "bar" for Nil:nilClass
) 때문에이 오류가와 관련이 있다고 생각하기가 쉽지 bar
않습니다 undefined
. 주의 깊게 읽지 않으면이 오류로 인해 초보자가 실수로 bar
메소드 의 세부 사항을 파고 들어가 Foo
오브젝트의 클래스가 잘못되었음을 암시하는 오류 부분이 완전히 없어집니다 (이 경우 : nil). 오류 메시지 전체를 읽음으로써 쉽게 피할 수있는 실수입니다.
요약:
디버깅을 시작하기 전에 항상 전체 오류 메시지 를 주의 깊게 읽으십시오 . 그 말은 : 항상 확인 클래스 오류 메시지에서 개체의 유형을 먼저 다음의 방법을 , 전에 당신이 오류가 발생 할 수있다 생각하고있는 모든 스택 트레이스 또는 코드의 라인으로 뒤를 쫓고 시작합니다. 이 5 초는 5 시간의 좌절을 줄일 수 있습니다.
tl; dr : 인쇄 로그를 긁지 마십시오. 예외를 발생 시키거나 irb 디버거를 대신 사용하십시오. 디버깅 전에 오류를주의 깊게 읽어 토끼 구멍을 피하십시오.
가능할 때마다 변수를 인쇄하십시오. 이것을 printf 디버깅이라고합니다.
STDERR.puts x.inspect
또는
STDERR.puts "Variable x is #{x.inspect}"
입력하기 쉽도록하려면 예시 보석 을 사용할 수 있습니다 .
경고를 켭니다. 실행중인 경우 스위치 (예 :) ruby
로 실행하십시오 . irb에서 실행 중이고 1.9.2 이전의 루비 버전을 사용중인 경우 세션 시작시 입력 하십시오. 인스턴스 변수의 철자를 잘못 입력하면 경고가 표시되면-w
ruby -w script.rb
$VERBOSE = true
경고 : 인스턴스 변수
@valeus
가 초기화되지 않았습니다
이진 절단의 개념 이해 (다음 인용문은 Agile Developer의 실습 에서 인용 )
문제 공간을 반으로 나누고 어느 절반에 문제가 있는지 확인하십시오. 그런 다음 반을 다시 반으로 나누고 반복하십시오.
이진 절단에 성공하면 예상대로 작동하지 않는 한 줄이있을 수 있습니다. 예를 들어
[1, 2, 3].include?([1,2])
false
return이라고 생각하더라도, 값을 제공합니다 true
. 이 경우 설명서를 참조하십시오. 설명서 웹 사이트에는 ruby-doc.org 또는 APIdock이 있습니다. 후자의 경우 include?
오른쪽 상단 근처에있는 돋보기 옆에 입력 include?
하고 Array
그 아래에있는 것을 선택하십시오 (무슨 클래스를 모르는 경우 irb를 [1, 2, 3]
입력하십시오 [1, 2, 3].class
) . (Array) , 이것이 수행하는 작업을 설명합니다.
그러나 설명서가 도움이되지 않는 경우 전체 스크립트가 왜 수행하지 않는지보다는 특정 라인이 어떻게해야하는지에 대한 질문을 할 수 있다면 좋은 대답을 얻을 가능성이 더 큽니다. 해야한다.
모든 것을 삭제
2017 년에 오신 것을 환영합니다 ^ _ ^
자, 만약 당신이 새로운 IDE를 시험해 보는 것에 반대하지 않는다면, 당신은 다음을 무료로 할 수 있습니다 .
launch.json
를 사용 "cwd"
하여 및 "program"
필드 를 사용하도록 구성{workspaceRoot}
"showDebuggerOutput"
하고로 설정하십시오.true
"debug.allowBreakpointsEverywhere": true
vscode
; 이것은 Visual Studio 와 동일하지 않습니다 . 무료이며 가벼우 며 일반적으로 긍정적으로 간주됩니다.View->Extensions
.vscode
거기에는 launch.json
구성 옵션을 저장할 파일 이 있습니다.
launch.json
내용
{
"version": "0.2.0",
"configurations":
[
{
"name": "Debug Local File",
"type":"Ruby",
"request": "launch",
"cwd": "${workspaceRoot}",
"program": "{workspaceRoot}/../script_name.rb",
"args": [],
"showDebuggerOutput": true
}
]
}
File->Preferences->Settings
(또는 Ctrl,)를 선택 하고 Debug
섹션에 도달 할 때까지 스크롤 합니다. 그것을 확장하고라는 필드를 찾으십시오 "debug.allowBreakpointsEverywhere"
-해당 필드를 선택하고 작은 연필 모양의 아이콘을 클릭하고로 설정하십시오 true
.재미있는 일을 모두 한 후에는 2017 년 중반과 비슷한 메뉴에서 더 어두운 테마를 사용하여 중단 점을 설정하고 디버그 할 수 있어야 합니다. 콜 스택, 변수 뷰어 등과 같은 모든 재미있는 일이 있습니다.
가장 큰 PITA는 1) 사전 요구 사항 설치 및 2) .vscode\launch.json
파일 구성 기억 입니다. # 2만이 미래의 프로젝트에 수하물을 추가해야하며 위에 나열된 것과 같은 일반적인 구성을 복사하면됩니다. 아마도 더 일반적인 설정 위치가있을 수 있지만, 나는 머리 꼭대기를 알지 못합니다.
현재 코드를 디버깅 할 적절한 도구를 선택하기 위해이 비디오를 강력히 추천합니다.
https://www.youtube.com/watch?v=GwgF8GcynV0
개인적으로이 비디오에서 두 가지 큰 주제를 강조하겠습니다.
그건 내 두 센트입니다!
다른 모든 답변은 이미 거의 모든 것을 제공합니다 ... 조금만 추가하십시오.
IDE와 유사한 디버거 (비 CLI)를 원하고 Vim을 편집기로 사용하는 것을 두려워하지 않는다면 Vim Ruby Debugger 플러그인을 권장 합니다.
그 문서는 매우 간단하므로 링크를 따라 가십시오. 즉, 편집기에서 현재 줄에 중단 점을 설정하고 일시 중지시 멋진 창에서 로컬 변수를 볼 수 있습니다. 거의 모든 일반적인 디버거 기능입니다.
Rails의 풍부한 로거 기능 이 거의 필요하지 않지만 Rails 앱을 디버깅하기 위해이 vim 디버거를 사용하는 것이 즐거웠 습니다.
방금이 보석을 발견했습니다 (Pry를 MRI Ruby 2.0 + 용 디버거로 바꿉니다)
https://github.com/deivid-rodriguez/pry-byebug
다음을 사용하여 설치 :
gem install pry-byebug
그런 다음을 정확하게 사용 pry
하고 싶을 줄을 표시하십시오.
require 'pry'; binding.pry
달리 바닐라 놀리려는 그러나,이 보석과 같은 몇 가지 주요 탐색 GDB 같은 명령이 next
, step
및 break
:
break SomeClass#run # Break at the start of `SomeClass#run`.
break Foo#bar if baz? # Break at `Foo#bar` only if `baz?`.
break app/models/user.rb:15 # Break at line 15 in user.rb.
break 14 # Break at line 14 in the current file.
Ruby 셸 스크립트를 쉽게 디버깅하려면 첫 번째 줄을 다음에서 변경하십시오.
#!/usr/bin/env ruby
에:
#!/usr/bin/env ruby -rdebug
그런 다음 디버거 콘솔이 표시 될 때마다 다음을 선택할 수 있습니다.
c
계속 (다음 예외, 중단 점 또는 다음 행 debugger
) :n
다음 줄의 경우w
/ where
프레임 / 호출 스택 표시l
현재 코드를 보여주기 위해cat
캐치 포인트를 표시합니다.h
도움이 더 필요합니다.ruby-debug gem 디버깅 , ruby-debug gem의 키 바로 가기 도 참조하십시오 .
스크립트가 중단 되고 역 추적이 필요한 경우 lldb
/ gdb
like를 사용해보십시오 .
echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)
그런 다음 프로세스 전경을 확인하십시오.
교체 lldb
와 함께 gdb
하면 더 좋습니다. sudo
비 소유 프로세스를 디버그하기위한 접두사 .
RubyMine 을 사용하는 경우 루비 스크립트 디버깅은 간단하고 간단합니다.
Ruby 스크립트 hello_world.rb가 있다고 가정하십시오.
6 번 줄에 아래와 같이 중단 점을 설정하십시오.
이제 디버거를 시작하여 스크립트를 실행할 수 있습니다.
그런 다음 실행이 중단 점에 도달하면 변수 등을 검사 할 수 있습니다.
printf 디버깅
디버깅 기술에 대해서는 항상 논쟁이 있었으며, 어떤 사람들은 print 문으로 디버깅하는 것을 좋아하고, 다른 사람들은 디버거를 깊이 파고 싶어합니다.
두 가지 접근 방식을 모두 시도해 보시기 바랍니다.
실제로 유닉스 노인 중 한 사람은 최근 printf 디버깅이 어떤 시점에서 그를 위해 더 빠른 방법이라고 말했다.
그러나 어떤 직업에 익숙하지 않고 코드의 큰 덩어리를 이해해야하는 경우, 여기저기서 단계별로 중단 점을두고 작동 방식과 함께 진행하는 것이 유용합니다.
코드가 짜는 방법을 이해해야합니다.
다른 사람 소프트웨어를 처음 사용하는 경우 해당 소프트웨어를 단계별로 실행하는 데 도움이 될 수 있습니다.
그들이 영리한 방식으로 정리했는지, 또는 그것이 단지 많은 똥인지 신속하게 알 수 있습니다.
: 음, 루비 표준 lib 디렉토리는 GDB와 같은 콘솔 디버거 사용하기 쉬운이 http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html 여분의 보석을 설치할 필요. 그런 식으로 Rails 스크립트도 디버깅 할 수 있습니다.
예 :
def say(word)
require 'debug'
puts word
end
모든 디버거의 어머니는 일반 오래된 인쇄 화면입니다. 대부분의 경우 간단한 객체 만 검사하고 싶을 것입니다. 빠르고 쉬운 방법은 다음과 같습니다.
@result = fetch_result
p "--------------------------"
p @result
이것은 쉽게 식별 할 수 있도록 @result의 내용을 앞에 줄과 함께 STDOUT으로 인쇄합니다.
Rails와 같은 자동로드 / 리로드 가능 프레임 워크를 사용하는 경우에는 앱을 다시 시작할 필요조차 없습니다. (프레임 워크 특정 설정으로 인해 디버깅중인 코드가 다시로드되지 않는 한)
나는 이것이 유스 케이스의 90 %에 효과적이라고 생각한다. 루비 디버그를 사용할 수도 있지만 대부분 과도하다고 생각합니다.