programing

루비 스크립트를 디버깅하는 방법

powerit 2023. 6. 2. 21:21
반응형

루비 스크립트를 디버깅하는 방법

인터넷에서 아래의 루비 코드를 복사하여 몇 가지 변경을 했지만 작동하지 않습니다.

프로그램을 직접 디버깅하려면 어떻게 해야 합니까?

프라이(GitHub)를 사용합니다.

설치 방법:

$ gem install pry
$ pry

그런 다음 추가:

require 'pry'; binding.pry

당신의 프로그램에.

기준pry.2 "0.12.2 "와 같은 탐색 .next,break기타 일부 보석은 추가적으로 이것을 제공합니다. 예를 참조하십시오.

  1. 루비에서:

    ruby -rdebug myscript.rb 
    

    그리고나서,

    • b <line>
    • 그리고.n(ext)또는s(tep)그리고.c(ontinue)
    • p(uts)

    (perl 디버깅과 같은)

  2. 인 레일: 다음을 사용하여 서버 시작

    script/server --debugger
    

    가추를 합니다.debugger암호로

배니스터가 추천한 대로: 프라이를 사용하세요!저는 이것에 대해서만 동의할 수 있습니다.

프라이는 irb보다 훨씬 더 나은 대답입니다.

추가해야 합니다.

require 'pry'

소스 파일에 추가한 다음 소스 코드에 중단점을 삽입합니다.

binding.pry

(이것은 고전적인 IDE 환경에서 중단점을 유발하는 것과 같습니다.)

프로그램이 실행되면

binding.pry

줄, 당신은 프로그램의 모든 컨텍스트를 바로 곁에 두고 프라이레플에 던져질 것입니다. 그래서 당신은 단순히 주변의 모든 것을 탐색하고, 모든 객체를 조사하고, 상태를 변경하고, 심지어 코드를 즉시 변경할 수 있습니다.

현재 진행 중인 메소드의 코드를 변경할 수 없기 때문에 안타깝게도 다음 행을 변경할 수 없습니다.하지만 좋은 루비 코드는 어쨌든 한 줄인 경향이 있습니다 ;-)

예외제기하여 디버깅하는 이 눈을 가늘게 뜨고 살펴보는 것보다 훨씬 쉽습니다.print로그 문, 그리고 대부분의 버그들은 일반적으로 irb 디버거를 여는 것보다 훨씬 빠릅니다.pry또는byebug이러한 도구가 항상 첫 번째 단계가 되어서는 안 됩니다.


루비/레일의 신속한 디버깅:

방법:: 라이▁an즈▁fast.Exception그때와 그 때.inspect 결과 ① ② ③

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

raise foo.inspect

위의 코드에서 코드 실행을 중지하는 를 트리거하고 편리하게 다음을 포함하는 오류 메시지를 반환합니다..inspect대상에 /이터에대즉정한보스이베method체즉,foo디버그하려는 회선에 있습니다.

이 기술은 객체 또는 메서드(예: ?)를 빠르게 검사하고 주어진 컨텍스트 내에서 코드 라인이 실행되는지 여부를 즉시 확인하는 데 유용합니다.

예비:다음과 같은 루비 IRB 디버거 사용byebug또는pry

와 같은 루비 보석 하는 것을 .pry또는byebug실행 경로 내의 개체 상태를 더 자세히 살펴볼 수 있습니다.


일반 초보자 조언

문제를 디버깅할 때는 항상 다음을 수행하는 것이 좋습니다.!@#$ing 오류 메시지(RTFM) 읽기

이것은 행동하기 전에 오류 메시지를 주의 깊게 그리고 완전히 읽음으로써 당신이 그것이 당신에게 말하려고 하는 것을 이해하는 것을 의미합니다.디버깅할 때 오류 메시지를 읽을 때 다음과 같은 질문을 이 순서대로 하십시오.

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

줄(스택추서 프예에제코라서공드인는되다에라인특기히니입울주는를의시트하작적로에젝다로음으▁starting예에▁in▁with▁that)에 를 기울입니다.app/...레일즈를 사용하는 경우).99%의 문제는 자신의 코드에 있습니다.


이 순서로 해석하는 것이 왜 중요한지 설명하기 위해...

예: 많은 초보자를 혼란스럽게 하는 Ruby 오류 메시지:

다음과 같이 실행되는 코드를 실행합니다.

@foo = Foo.new

...

@foo.bar

다음과 같은 오류가 표시됩니다.

undefined method "bar" for Nil:nilClass

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

for Nil:nilClass

for Nil:nilClass는 것을 의미합니다.@foo닐입니다! @foo가 아닙니다.Foo인스턴스 변수!당신은 어떤 물건을 가지고 있습니다.Nil이 오류가 나타나면 루비가 방법을 알려주는 것입니다.barNil duh!입니다! 우쎄수방목법사하고때용다기니문입려하글을적에요업의리는▁(다니▁since때입▁we!▁for.Foo것은 아니다.Nil).

유감스럽게도 이 오류가 기록되는 방식 때문에 (undefined method "bar" for Nil:nilClass이가 와 이 있다고 .barundefined주의 깊게 읽지 않을 때 이 오류는 초보자들이 실수로 세부사항을 파고들게 합니다.bar에 있는 방법.Foo개체가 잘못된 클래스(이 경우 0)임을 암시하는 오류 부분이 완전히 누락되었습니다.오류 메시지 전체를 읽음으로써 쉽게 피할 수 있는 실수입니다.

요약:.

디버깅을 시작하기 전에 항상 전체 오류 메시지를 주의 깊게 읽으십시오.즉, 다음과 같습니다.항상 오류 메시지에서 개체의 클래스 유형을 먼저 확인한 다음 오류가 발생할 수 있는 스택 추적 또는 코드 줄로 슬루딩하기 메서드를 확인합니다.그 5초는 여러분의 좌절감을 5시간 줄일 수 있습니다.

tl;dr: 로그 인쇄를 눈을 가늘게 뜨지 않고 예외를 제기하거나 irb 디버거를 대신 사용합니다.디버깅하기 전에 오류를 주의 깊게 읽어 토끼 구멍을 방지합니다.

  1. 가능하면 언제든지 변수를 출력합니다.(이를 printf 디버깅이라고 함) 다음을 실행하여 이를 수행할 수 있습니다.

    STDERR.puts x.inspect
    

    또는

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

    입력하기 쉽게 하려면 예제 보석을 사용하는 것이 좋습니다.

  2. 경고를 설정합니다.실행 중인 경우ruby그리고 나서 그것을 실행합니다.-w: 스치예(위):ruby -w script.rb). 1irb 서실있고 1.9.2 이루버비사있전다입다같력니합이음다과면용고하를을 $VERBOSE = true세션이 시작될 때.인스턴스 변수의 철자를 잘못 입력하면 경고가 표시되면

    variable 고경: 인스턴스 변수@valeus.

  3. 바이너리 컷의 개념 이해(다음 인용문은 신속한 변화를 위한 개발자의 실무 지침에서 인용한 것입니다)

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

  4. 바이너리 컷을 성공적으로 사용할 경우 예상한 것을 수행하지 않는 단일 행이 있을 수 있습니다.예를들면

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

    의 가치를 부여합니다.false▁it말입▁even다니만▁though▁you'▁return지다d.true이 경우 설명서를 참조할 수 있습니다.설명서용 웹 사이트에는 ruby-doc.org 또는 APIdock이 있습니다.후자의 경우에는 다음과 같이 입력합니다.include?에 있는 돋보기를 .include?이 있는Array그에 (이 어떤 클래스인지)[1, 2, 3]is, type[1, 2, 3].classirb)에서, 그리고 당신은?(어레이)를 포함할 수 있습니다. 이것은 그것이 무엇을 하는지 설명합니다.

    그러나 설명서가 도움이 되지 않는 경우 전체 스크립트가 수행해야 하는 작업을 수행하지 않는 이유보다는 특정 행이 수행해야 하는 작업을 수행하지 않는 방법에 대한 질문을 할 수 있으면 좋은 답변을 얻을 가능성이 높습니다.

루비 셸 스크립트를 쉽게 디버그하려면 첫 줄을 다음에서 변경하면 됩니다.

#!/usr/bin/env ruby

대상:

#!/usr/bin/env ruby -rdebug

그런 다음 디버거 콘솔이 표시될 때마다 다음을 선택할 수 있습니다.

  • cException, ):debugger),
  • n줄의 경우, 다음줄 의경우경
  • w/where스택을 하려면 , "/통화 스택",
  • l코드를 하려면 ,
  • cat캡처 시점을 표시합니다.
  • h더 많은 도움이 필요합니다.

참고 항목:루비 디버그를 사용한 디버깅, 루비 디버그 보석의 키 바로 가기.


스크립트가 중단되고 역추적이 필요한 경우 다음을 사용해 보십시오.lldb/gdb 예:

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

공정 전경을 확인합니다.

를 바꿉니다.lldb와 함께gdb더 잘 되면요.:sudo소유되지 않은 프로세스를 디버그합니다.

저는 방금 이 보석을 발견했습니다(프라이를 MRI 루비 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.

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

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

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

  • 프라이는 디버그 데이터에 적합합니다. "프라이는 데이터 탐색기입니다." (sic)
  • 디버거는 디버그를 단계적으로 하는 것이 더 나은 것 같습니다.

그건 내 2센트야!

다른 모든 대답들은 이미 거의 모든 것을 제공합니다...조금만 더 추가하면 됩니다.

좀 더 IDE와 같은 디버거(비CLI)를 원하고 Vim을 편집기로 사용하는 것을 두려워하지 않는다면 Vim Ruby Debugger 플러그인을 추천합니다.

문서화는 매우 간단하므로 링크를 따라 확인하십시오.간단히 말해서, 편집기에서 현재 줄의 중단점을 설정하고, 일시 중지 시 멋진 창에서 로컬 변수를 볼 수 있으며, 거의 모든 일반적인 디버거 기능을 단계적으로 오버/인투할 수 있습니다.

Rails의 풍부한 로거 기능이 거의 필요하지 않지만 Rails 앱을 디버깅하기 위해 이 vim 디버거를 사용하는 것은 저에게 꽤 즐거웠습니다.

Ruby 2.4.0부터는 Ruby 프로그램 중간에 IRB REPL 세션을 시작하는 것이 더 쉽습니다.디버깅할 프로그램의 지점에 다음 행을 놓습니다.

require 'irb'
binding.irb

루비 코드를 실행하여 로컬 변수를 출력할 수 있습니다. 또는 Ctrl+D quitREPL을 종료하고 Ruby 프로그램이 계속 실행되도록 합니다.

사용할 수도 있습니다.puts그리고.p실행 중인 프로그램에서 값을 출력합니다.

모든 것을 삭제합니다.

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

새 IDE를 사용해 보는 것에 반대하지 않는다면 다음을 무료로 수행할 수 있습니다.

빠른 지침

  1. vcode 설치
  2. 아직 설치하지 않은 경우 Ruby Dev Kit 설치
  3. vscode용 Ruby, Ruby-linter 및 Ruby-Rubocop 확장 설치
  4. 필요한 경우 루비이드/vscode-ruby가 지정한 모든 보석을 수동으로 설치합니다.
  5. 를 구성합니다.launch.json용할을 "cwd"그리고 "program"{workspaceRoot}거시적인
  6. 다필드추라는 합니다."showDebuggerOutput"으로 설정합니다.true
  7. 을 사용 가능으로 합니다."debug.allowBreakpointsEverywhere": true

상세 지침

  1. Visual Studio 코드 다운로드vscodeVisual Studio와 다릅니다.그것은 자유롭고, 가볍고, 일반적으로 긍정적으로 평가됩니다.
  2. Ruby Dev Kit를 설치합니다. 설명서의 지침을 따라야 합니다. https://github.com/oneclick/rubyinstaller/wiki/Development-Kit
  3. 그런 다음 웹 브라우저를 통해 또는 IDE 내부에 확장을 설치할 수 있습니다. 이 확장은 IDE 내부용입니다.당신이 다른 것을 선택하면, 당신은 여기로 갈 수 있습니다.vscode의 Extensions 부분으로 이동합니다. 몇 가지 방법으로 이 작업을 수행할 수 있지만, 가장 미래에 대비하는 방법은 아마도 를 누르고 Extensions라는 옵션이 나올 때까지 입력하는 것일 것입니다. 확장 설치를 사용할 수 있습니다.또는 상단 메뉴 모음에서 선택할 수 있습니다.View->Extensions
  4. 다음에는 다음과 같은 확장 기능이 필요합니다. 100% 필요한 것은 아니지만, 몇 가지 항목을 입력한 후에 유지할 항목을 결정할 수 있습니다.
    • 루비; 확장 작가 펭 Lv.
    • 루비 루보캅; 확장 작성자 미소기
    • 루비-린터; 확장 저자 코디 후버
  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. 수동 보석 설치는 확장 작성자의 지침을 따릅니다.현재 위치는 https://github.com/rubyide/vscode-ruby#install-ruby-dependencies 입니다.
  2. 원하는 위치에 중단점을 둘 수 있는 기능을 원할 수 있습니다. 이 옵션을 사용하지 않으면 혼란이 발생할 수 있습니다.위해 " 이작을수행상단메면뉴이모음동로여하으려하업이"를합니다.File->Preferences->Settings(또는 )에 도달할 때까지 스크롤합니다.Debug부분. 확고다필찾드다습니를음라는 필드를 ."debug.allowBreakpointsEverywhere"한 후 해당필드선택연필모양작의은아클이을릭다다설정음으로 설정합니다.true.

그렇게 재미있는 일을 다 한 후에, 여러분은 2017년 중반에 이것과 유사한 메뉴에서 중단점을 설정하고 디버그할 수 있을 것입니다: 여러분의 여기에 이미지 설명 입력콜 스택, 가변 뷰어 등과 같은 재미있는 모든 것들을 가지고 말입니다.

큰 및 하기 1) 장가 큰 PITA 는 1) 사 사 2) 구 기 는 하 것 입 니 억 다 을 성 및 설 치 항 요 전 구 ▁the 것.vscode\launch.json파일. #2만 향후 프로젝트에 수하물을 추가해야 하며, 위에 나열된 것과 같은 일반 구성만 복사하면 됩니다.좀 더 일반적인 구성 위치가 있을 수도 있지만, 저는 바로 알 수 없습니다.

  1. 당신은 당신의 변수들을 도중에 인쇄할 수 있습니다.
  2. .-w깃발)
  3. 루비 디버그와 같은 도구 사용

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

루비 스크립트 hello_world.rb가 있다고 가정합니다.

중단점 설정

아래와 같이 라인 6에 브레이크 포인트를 설정합니다.

여기에 이미지 설명 입력

디버깅 시작

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

여기에 이미지 설명 입력

여기에 이미지 설명 입력

변수 등을 점검합니다.

그런 다음 실행이 중단점에 도달하면 변수 등을 검사할 수 있습니다.

여기에 이미지 설명 입력

참조할 수 있는 추가 정보

  1. RubyMine을 사용하여 원격 디버깅을 수행할 수 있습니다.
  2. RubyMine을 사용하여 도커 내부에서 실행되는 원격 디버그 레일을 사용하는 경우에도 간단합니다.

, 루비 표준 lib는 gdb와 같은 콘솔 디버거를 사용하기 쉽습니다: http://ruby-doc.org/stdlib-2.1.0/libdoc/debug/rdoc/DEBUGGER__.html 추가 보석을 설치할 필요가 없습니다.레일 스크립트도 그런 식으로 디버깅할 수 있습니다.

예.

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

printf 디버깅

디버깅 기술에 대해서는 항상 논란이 있었습니다. 어떤 사람들은 인쇄문으로 디버깅하는 것을 좋아하고, 어떤 사람들은 디버거로 깊이 파고드는 것을 좋아합니다.

두 가지 방법을 모두 시도해 보는 것이 좋습니다.

사실 한 오래된 유닉스 직원은 최근에 printf 디버깅이 어느 시점에서 그에게 더 빠른 방법이라고 말했습니다.

하지만 만약 여러분이 어떤 일을 처음 해보고 큰 코드 덩어리를 이해해야 한다면, 여기 저기에 브레이크 포인트를 두고 그것이 어떻게 작동하는지 따라가는 것이 정말 유용합니다.

코드가 어떻게 짜여지는지 이해할 수 있을 것입니다.

만약 당신이 몇몇 다른 사람들의 소프트웨어에 익숙하지 않다면, 그것은 당신이 그곳을 통과하는 데 도움이 될 것입니다.

당신은 그들이 그것을 영리한 방법으로 정리했는지 또는 그것이 단지 헛소리인지 금방 알 수 있을 것입니다.

모든 디버거의 어머니는 일반적인 오래된 인쇄 화면입니다.대부분의 경우 몇 가지 간단한 개체만 검사하려고 할 수 있습니다. 빠르고 쉬운 방법은 다음과 같습니다.

@result = fetch_result

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

이렇게 하면 @result의 내용을 쉽게 식별할 수 있도록 앞줄이 있는 STDOUT로 출력합니다.

Rails와 같은 자동 로드/재로드 가능 프레임워크를 사용하면 앱을 다시 시작할 필요가 없습니다. (프레임워크별 설정으로 인해 디버깅 중인 코드가 다시 로드되지 않는 경우)

저는 이것이 사용 사례의 90%에 해당한다는 것을 알게 되었습니다.루비 디버그를 사용할 수도 있지만, 대부분의 경우 과잉 살상을 합니다.

사용자가 선택하는 다양한 기능을 가진 디버거가 많이 있습니다.저의 우선순위는 다음과 같은 프라이무브에 만족했습니다.

  • 빠르게 이해할 수 있는 사용 방법에 대한 정보
  • 직관적인 단계(블록에 쉽게 들어가는 것과 같은)
  • "반복"(부분적으로 필요를 충족시키는 부분적으로 moves-반복)

언급URL : https://stackoverflow.com/questions/3955688/how-to-debug-ruby-scripts

반응형