Programing

Ruby 스크립트를 어떻게 디버깅합니까?

crosscheck 2020. 6. 14. 10:32
반응형

Ruby 스크립트를 어떻게 디버깅합니까? [닫은]


인터넷에서 다음 Ruby 코드를 복사하고 약간 변경했습니다.

그러나 작동하지 않습니다!

도와주세요. 프로그램을 직접 디버깅하려면 어떻게해야합니까?


Pry ( GitHub )를 사용하십시오 .

다음을 통해 설치하십시오.

$ gem install pry
$ pry

그런 다음 다음을 추가하십시오.

require 'pry'; binding.pry

당신의 프로그램으로.

현재 pry0.12.2 그러나, 네비게이션 등의 명령하지있다 next, break다른 어떤 보석이 별도로 제공 등이 예를 들면 참조 pry-byedebug.


  1. 루비에서 :

    ruby -rdebug myscript.rb 
    

    그때,

    • b <line>: 중단 점을 넣습니다
    • n(ext)또는 s(tep)c(ontinue)
    • p(uts) 디스플레이 용

    (펄 디버그와 같은)

  2. Rails에서 :

    script/server --debugger
    

    debugger코드에 추가 하십시오.


난간 권장 : pry를 사용하십시오! 나는 이것에 대해서만 동의 할 수 있습니다.

pry는 irb보다 훨씬 좋습니다.

당신은 추가해야합니다

require 'pry'

소스 파일에 추가 한 다음 소스 코드에 중단 점을 추가하여

binding.pry

사물을 보려는 곳에서 (이것은 고전적인 IDE 환경에서 중단 점을 트리거하는 것과 같습니다)

프로그램이

binding.pry

라인을 사용하면 프로그램의 모든 컨텍스트를 바로 사용할 수있는 pry repl에 바로 들어갈 수 있으므로 모든 것을 탐색하고 모든 객체를 조사하고 상태를 변경하며 코드를 즉시 변경할 수도 있습니다.

현재 사용중인 메소드의 코드를 변경할 수 없으므로 슬프게도 다음 줄을 변경할 수 없습니다. 그러나 좋은 루비 코드는 어쨌든 한 줄인 경향이 있습니다 ;-)


예외를 제기하여 디버깅하는 것은로그 문을통해 가늘게 뜨는 것보다 훨씬 쉽고print 대부분의 버그의 경우 일반적으로또는같은 irb 디버거를 여는 보다 훨씬 빠릅니다 . 이러한 도구는 첫 단계가되어서는 안됩니다.prybyebug


루비 / 레일 디버깅 :

1. 빠른 방법 : Exception그때와 .inspect그 결과를 올립니다

Ruby (특히 Rails) 코드를 디버깅 하는 가장 빠른 방법 은 메소드 또는 객체 (예 raise:)를 호출 .inspect하는 동안 코드의 실행 경로를 따라 예외를 처리하는 것입니다 foo.

raise foo.inspect

위의 코드에서 코드의 실행중지시키는를raise 트리거하고 디버그하려는 행 의 객체 / 방법 (예 :)에 대한 정보가 포함 된 오류 메시지를 반환합니다 .Exception.inspectfoo

이 기법은 객체 나 메소드 신속하게 검사하고 ( 예 : nil? ) 주어진 라인 내에서 코드 라인이 실행되고 있는지 즉시 확인 하는 데 유용합니다 .

폴백 : 또는 같은 루비 IRB 디버거를 사용하십시오byebugpry

코드 실행 흐름의 상태에 대한 정보를 얻은 후에 만 ​​루비 젬 irb 디버거로 이동 pry하거나 byebug실행 경로 내의 객체 상태를 더 깊이 파고들 수있는 곳을 고려해야 합니다.


일반 초보자 조언

문제를 디버깅하려고 할 때는 항상 다음과 같이하는 것이 좋습니다 .! @ # $ ing 오류 메시지 (RTFM)

, 행동을 취하기 전에 오류 메시지를 주의 깊고 완전히 읽어야 합니다. 디버깅 할 때 오류 메시지를 읽을 때 다음과 같은 정신적 인 질문을 순서대로 수행하십시오 .

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

스택 추적에서 프로젝트에서 나오는 코드 줄 (예 : 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 : 인쇄 로그에서 곁눈질하지 마십시오 : 대신 예외를 발생시킵니다. 디버깅 전에 오류를주의 깊게 읽어 토끼 구멍을 피하십시오.


  1. 가능할 때마다 변수를 인쇄하십시오. 이것을 printf 디버깅이라고합니다.

    STDERR.puts x.inspect
    

    또는

    STDERR.puts "Variable x is #{x.inspect}"
    

    입력하기 쉽도록하려면 예시 보석 을 사용할 수 있습니다 .

  2. 경고를 켭니다. 실행중인 경우 스위치 (예 :) ruby로 실행하십시오 . irb에서 실행 중이고 1.9.2 이전의 루비 버전을 사용중인 경우 세션 시작시 입력 하십시오. 인스턴스 변수의 철자를 잘못 입력하면 경고가 표시되면-wruby -w script.rb$VERBOSE = true

    경고 : 인스턴스 변수 @valeus가 초기화되지 않았습니다

  3. 이진 절단의 개념 이해 (다음 인용문은 Agile Developer의 실습 에서 인용 )

    문제 공간을 반으로 나누고 어느 절반에 문제가 있는지 확인하십시오. 그런 다음 반을 다시 반으로 나누고 반복하십시오.

  4. 이진 절단에 성공하면 예상대로 작동하지 않는 한 줄이있을 수 있습니다. 예를 들어

    [1, 2, 3].include?([1,2])
    

    falsereturn이라고 생각하더라도, 값을 제공합니다 true. 이 경우 설명서를 참조하십시오. 문서화 웹 사이트에는 ruby-doc.org 또는 APIdock이 있습니다. 후자의 경우 include?오른쪽 상단 근처에있는 돋보기 옆에 입력 include?하고 Array그 아래에있는 것을 선택하십시오 (무슨 클래스를 모르는 경우 irb를 [1, 2, 3]입력하십시오 [1, 2, 3].class) . (Array) , 그것이 수행하는 작업을 설명합니다.

    그러나 문서가 도움이되지 않으면 전체 스크립트가 왜하지 않는지보다는 특정 행이 어떻게 작동하지 않는지에 대한 질문을 할 수 있다면 좋은 대답을 얻을 가능성이 큽니다. 해야한다.


모든 것을 삭제

2017 년에 오신 것을 환영합니다 ^ _ ^

자, 만약 당신이 새로운 IDE를 시험해 보는 것에 반대하지 않는다면, 당신은 다음을 무료로 할 수 있습니다 .

빠른 지침

  1. vscode 설치
  2. 아직 Ruby Dev Kit을 설치하지 않았다면 설치하십시오
  3. vscode 용 Ruby, ruby-linter 및 ruby-rubocop 확장 설치
  4. 필요한 경우 rubyide / vscode-ruby가 지정 하는 gem을 수동으로 설치
  5. 매크로 launch.json를 사용 "cwd"하여 "program" 필드 를 사용하도록 구성{workspaceRoot}
  6. 라는 필드를 추가 "showDebuggerOutput"하고로 설정하십시오.true
  7. 디버그 환경 설정의 모든 곳에서 중단 점을 활성화하십시오. "debug.allowBreakpointsEverywhere": true

자세한 지침

  1. Visual Studio Code 일명 다운로드 vscode; 이것은 Visual Studio 와 동일하지 않습니다 . 무료이며 가벼우 며 일반적으로 긍정적으로 간주됩니다.
  2. Ruby Dev Kit를 설치하십시오. https://github.com/oneclick/rubyinstaller/wiki/Development-Kit 에서 해당 리포지토리의 지침을 따라야합니다.
  3. 다음으로 웹 브라우저를 통해 또는 IDE 내부에 확장을 설치할 수 있습니다. 이것은 IDE 내부에 있습니다. 다른 것을 선택하면 여기 로 갈 수 있습니다 . vscode의 확장 부분으로 이동하십시오. 몇 가지 방법으로이 작업을 수행 할 수 있지만 가장 확실한 방법은 확장 프로그램 : 확장 프로그램 설치 옵션 이 제공 될 때까지 F1입력하고 입력하는 것입니다 . 대안은 상단 메뉴 바에서 그리고extCtrlShiftxView->Extensions
  4. 다음은 다음 확장을 원할 것입니다. 이것들은 100 % 필요하지는 않지만, 몇 가지 문제를 해결 한 후에 무엇을 보관해야하는지 결정하도록하겠습니다.
    • 루비; 확장 저자 Peng Lv
    • 루비 루보 캅; 확장 저자 미소 기
    • 루비 라이너; 확장 저자 Cody Hoover
  5. 루비 스크립트의 디렉토리 안에는 커맨드 라인을 통해 디렉토리를 만들 것이고 .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 } ] }

  1. 수동 gem 설치에 대해서는 확장 작성자의 지시 사항을 따르십시오. https://github.com/rubyide/vscode-ruby#install-ruby-dependencies : 여기에 있습니다
  2. 원하는 곳에 중단 점을 둘 수있는 기능을 원할 것입니다. 이 옵션을 사용하지 않으면 혼동 될 수 있습니다. 이렇게하려면 상단 메뉴 표시 줄로 이동하여 File->Preferences->Settings(또는 Ctrl,)를 선택 하고 Debug섹션에 도달 할 때까지 스크롤 합니다. 그것을 확장하고라는 필드를 찾으십시오 "debug.allowBreakpointsEverywhere"-해당 필드를 선택하고 작은 연필 모양의 아이콘을 클릭하고로 설정하십시오 true.

재미있는 일을 모두 한 후에는 2017 년 중반과 비슷한 메뉴에서 더 어두운 테마를 사용하여 중단 점을 설정하고 디버그 할 수 있어야 여기에 이미지 설명을 입력하십시오합니다. 콜 스택, 변수 뷰어 등과 같은 모든 재미있는 일이 있습니다.

가장 큰 PITA는 1) 사전 요구 사항 설치 및 2) .vscode\launch.json파일 구성 기억 입니다. # 2만이 미래의 프로젝트에 수하물을 추가해야하며 위에 나열된 것과 같은 일반적인 구성을 복사하면됩니다. 아마도 더 일반적인 설정 위치가있을 수 있지만, 나는 머리 꼭대기를 알지 못합니다.


다른 모든 답변은 이미 거의 모든 것을 제공합니다 ... 조금만 추가하십시오.

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, stepbreak:

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.

  1. 길을 따라 변수를 인쇄 할 수 있습니다
  2. -w(경고) 플래그를 켭니다
  3. 루비 디버그 와 같은 도구를 사용하십시오.

현재 코드를 디버깅 할 적절한 도구를 선택하기 위해이 비디오를 강력히 추천합니다.

https://www.youtube.com/watch?v=GwgF8GcynV0

개인적으로이 비디오에서 두 가지 큰 주제를 강조하겠습니다.

  • Pry는 디버그 데이터에 훌륭합니다. "Pry는 데이터 탐색기입니다"(sic)
  • 디버거는 단계별로 디버깅하는 것이 좋습니다.

그건 내 두 센트입니다!


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/ gdblike를 사용해보십시오 .

echo 'call (void)rb_backtrace()' | lldb -p $(pgrep -nf ruby)

그런 다음 프로세스 전경을 확인하십시오.

교체 lldb와 함께 gdb하면 더 좋습니다. sudo비 소유 프로세스를 디버그하기위한 접두사 .


Ruby 2.4.0부터는 Ruby 프로그램 중간에 IRB REPL 세션을 시작하는 것이 더 쉽습니다. 프로그램에서 디버그하려는 지점에 다음 행을 넣으십시오.

require 'irb'
binding.irb

Ruby 코드를 실행하고 로컬 변수를 인쇄 할 수 있습니다. Ctrl + D를 입력하거나 quitREPL을 끝내고 Ruby 프로그램을 계속 실행 시키십시오.

당신은 또한 사용할 수 있습니다 putsp이 실행되는 프로그램에서 값을 출력 할 수 있습니다.


RubyMine 을 사용하는 경우 루비 스크립트 디버깅은 간단하고 간단합니다.

Ruby 스크립트 hello_world.rb가 있다고 가정하십시오.

1. 중단 점 설정

6 번 줄에 아래와 같이 중단 점을 설정하십시오.

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

2. 디버깅 시작

이제 디버거를 시작하여 스크립트를 실행할 수 있습니다.

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

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

3. 변수 등 검사

Then when the execution hits a breakpoint, you'll be able to inspect variables, etc.

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

Further information for your reference

  1. If you would like to use RubyMine to do remote debugging, you can do so.
  2. If you would like to use RubyMine to remote debug rails running inside a docker, it is also straightforward.

printf debugging

There has always been a controversy around debugging techniques, some people like to debug by print statements, some other ones like to dig deep with a debugger.

I'd suggest that you try both approaches.

Actually one of the old Unix men recently said, that printf debugging was a faster way to go for him at some points.

But if you are new at some job and need to understand a big blob of code, then it's really usefull to step throughout there, putting some breakpoints here and there, going along with it how it works.

It should give you some understanding how the code is weaved.

If you are new to some other peoples software, It might help you to step through there.

You'll quickly find out if they arranged it in a clever way, or if that's just a bunch of shit.


Well, ruby standard lib has an easy to use gdb-like console debugger: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html No need to install any extra gems. Rails scripts can be debugged that way too.

e.g.

def say(word)
  require 'debug'
  puts word
end

The mother of all debugger is plain old print screen. Most of the time, you probably only want to inspect some simple objects, a quick and easy way is like this:

@result = fetch_result

p "--------------------------"
p @result

This will print out the contents of @result to STDOUT with a line in front for easy identification.

Bonus if you use a autoload / reload capable framework like Rails, you won't even need to restart your app. (Unless the code you are debugging is not reloaded due to framework specific settings)

I find this works for 90% of the use case for me. You can also use ruby-debug, but I find it overkill most of the time.


There is many debuggers with different features, based on which you make choice. My priorities was satisfied with pry-moves which was:

  • quickly comprehensible info on how to use
  • intuitive steps (like easy stepping into blocks)
  • "뒤로 물러서"(pry-moves는 부분적으로 필요를 충족시킵니다)

참고 URL : https://stackoverflow.com/questions/3955688/how-do-i-debug-ruby-scripts

반응형