Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 프로그램을 디버그하고 수정하는 방법

귀하의 프로그램은 처음에 원하는 것을 정확히 얼마나 자주 수행합니까?

많은 경우 프로그램이 예상대로 작동하지 않으므로 루비 디버깅 기술을 사용해야 합니다. 이유를 찾는 데 도움이 됩니다.

다음 오류 메시지에 익숙할 수 있습니다.

undefined method 'some_method' for nil:NilClass

이것은 nil 값이 우리 코드에 들어갈 방법을 찾았음을 의미합니다.

이 기사에서 논의된 기술을 사용하여 이 문제 및 유사한 문제를 처리하는 방법을 배우게 될 것입니다!

오류 및 스택 추적 이해

Ruby 인터프리터에서 오류가 발생하거나 프로그램이 해야 할 일을 하지 않을 때 디버깅 모자를 써야 합니다.

문제가 프로그램 충돌인 경우 오류 메시지에 주의하는 것이 중요합니다. , 일반적으로 무엇이 잘못되었는지에 대한 단서를 포함합니다.

예시입니다 :

def method1
  method2
end

def method2
  puts invalid_variable
end

method1

이 코드를 실행하면 다음 오류가 발생합니다.

/tmp/stack.rb:6:in 'method2': undefined local variable or method 'invalid_variable' for main:Object (NameError)
    from /tmp/stack.rb:2:in 'method1'
    from /tmp/stack.rb:9:in '
'
에서

이것이 스택 추적으로 알려진 것입니다.

함께 분석해 봅시다!

맨 위에 있는 줄부터 시작합니다.

여기에서 실제 오류가 발생했지만 오류 조건이 여기에서 발생했다는 의미는 아닙니다.

그러나 조사를 시작하는 것이 좋습니다.

거래가 있습니다 :

텍스트 설명
/tmp/stack.rb :6 파일 및 줄 번호
`메서드2 ' 메서드 이름
정의되지 않은 지역 변수 또는 메소드 'invalid_variable ' 오류 메시지
기본:개체 클래스 이름
(이름 오류) 예외 이름

보시다시피 이런 식으로 분해하면 오류가 그렇게 위협적이지 않습니다.

그건 그렇고, 여기에서 예외 목록을 찾을 수 있습니다.

지금 :

첫 번째 줄 아래에 있는 스택 추적의 모든 줄은 코드가 어떻게 여기에 왔는지 알려줍니다.

기본적으로 메서드 체인이므로 계속 내려가다 보면 결국 앱의 주요 메서드를 찾아야 합니다.

다음은 스택 추적을 처리하기 위한 일반적인 알고리즘입니다. :

  1. 스택 추적의 맨 윗줄 읽기
  2. 파일이 프로젝트의 일부인 경우:표시된 줄 번호에서 오류가 있는 파일을 엽니다. 그렇지 않은 경우 인식하는 파일에 대한 첫 번째 참조를 찾을 때까지 스택 추적을 계속 진행합니다.
  3. 명백한 내용이 있는지 확인하고 수정합니다(오류 메시지에 언급된 내용 확인)
  4. 도움이 되지 않으면 영향을 받는 변수의 값과 같은 추가 정보를 찾아야 합니다.

루비 디버깅

여러분이 잘 알고 있는 가장 기본적인(꼭 나쁜 의미는 아님) 디버깅 기술은 의심되는 변수의 값을 덤핑하는 것입니다.

Ruby에서는 put을 사용하여 그렇게 할 수 있습니다. 또는 p .

p 사용 puts variable.inspect라고 말하는 것과 같습니다. , 그리고 사물을 볼 때 유용합니다.

:

Book = Struct.new(:title)

def find_book(title)
  books = []
  books << Book.new('Eloquent Ruby')

  books.find { |b| b.title == title }
end

book = find_book('Eloquent Ruby')
p book # This will print our book object

book = find_book('POODR')
p book # This will print nil

book.name # Guess what happens next!

Pry로 더 깊이 파고들기

확인할 변수가 많을 때 puts 추가 모든 곳에서 그다지 실용적이지 않을 수 있습니다.

이 경우 pry를 시도해야 합니다.

프라이 사용 코드가 특정 코드 줄(중단점이라고도 함)에서 멈추도록 만들 수 있으며 프로젝트 컨텍스트에서 루비 코드를 평가하거나 여러 코드 중 하나를 실행할 수 있는 irb와 유사한 환경으로 떨어뜨립니다. 유용한 프라이 명령.

pry 사용은 정말 쉽습니다. :

binding.pry를 삭제하기만 하면 됩니다. pry 중단점을 설치하려는 위치입니다.

또한 프로젝트에 pry가 필요합니다('pry' 필요).

임시로 수행하려는 경우 다음과 같이 루비 스크립트를 호출할 수 있습니다.

ruby -rpry app.rb

레일 앱에는 그다지 도움이 되지 않으므로 Gemfile에 pry를 추가하는 것이 좋습니다.

내가 하고 싶은 것은 이미 중단점과 같은 줄에 require가 포함된 매크로/스니펫을 편집기에 두는 것이므로 삭제하면 두 가지 모두 삭제됩니다.

이것은 당신이 pry 세션에 빠졌을 때 보게 될 것입니다:

Ruby 프로그램을 디버그하고 수정하는 방법

pry 세션을 완전히 종료하려면 exit!를 입력할 수 있습니다. , 일반 exit를 하는 경우 다음 중단점까지 프로그램을 실행합니다.

피리의 힘은 여기서 끝이 아닙니다. 예를 들어 ls를 사용할 수 있습니다. 개체가 액세스할 수 있는 메서드 및 인스턴스 변수를 확인하는 명령입니다.

Ruby 프로그램을 디버그하고 수정하는 방법

도움말을 실행하는 것을 잊지 마십시오. 모든 음식의 목록을 가져오는 명령!

또 다른 Ruby 디버거:Byebug

Byebug는 루비에 대한 pry 대체 또는 gdb와 같은 디버거로 작동할 수 있습니다.

전자에 사용하려면 byebug를 삭제하면 됩니다. binding.pry 대신 코드를 멈추고 싶은 곳. Byebug를 pry보다 사용하는 단점 중 하나는 구문 강조 표시를 제공하지 않는다는 것입니다.

중단점을 설정하고 byebug 내에서 코드를 디버그하는 방법을 살펴보겠습니다.

일반적으로 help 명령을 호출하지만 이 경우 정보가 약간 부족합니다.

Ruby 프로그램을 디버그하고 수정하는 방법

따라서 문서를 참조해야 합니다.

break 명령을 사용하는 방법을 볼 수 있습니다. 중단점을 설정할 수 있는 줄 번호입니다.

중단점 목록을 얻으려면 정보 중단점을 사용할 수 있습니다. .

중단점이 설정되면 다음 명령을 사용하여 프로그램 실행을 이동할 수 있습니다.

  • 단계 (한 단계 진행, 메소드 호출 단계)
  • 다음 (하나의 명령을 진행하고 메소드 내부에 들어가지 않음)
  • 계속 (끝 또는 다음 중단점까지 실행)

명령 없이 Enter를 입력하고 마지막 명령만 반복하면 코드를 탐색할 때 매우 유용합니다.

다른 모든 것이 실패할 때

충분한 시간을 투자하여 해결책이 보이지 않을 때는 반드시 휴식을 취하십시오. 새로운 눈으로 돌아오면 해결책이 눈앞에 있음을 깨닫게 될 것입니다. 다른 사람에게 문제를 설명할 수도 있습니다.

문제가 어디에 있는지 확실하지 않은 경우가 있을 수 있습니다. 이 경우 여전히 많은 옵션이 있습니다.

예를 들어, 문제를 분리하기 위해 코드 블록에 주석을 달 수 있습니다.

문제가 사라지면 방금 주석 처리한 코드의 일부를 주석 처리 해제할 수 있습니다.

이것은 매우 낮은 기술의 솔루션이지만 정확히 필요한 것일 수 있습니다.

여기까지 왔는데 아무 것도 도움이 되지 않는 경우 :

큰 총을 꺼낼 시간입니다.

다음은 종종 도움이 될 수 있는 몇 가지 시스템 도구입니다.

이러한 도구 중 하나는 네트워크 트래픽을 검사할 수 있는 Wireshark입니다.

SSL 암호화 트래픽을 처리하는 경우 mitmproxy와 같은 mitm(Man in the middle) 프록시가 도움이 될 수 있습니다.

을 시도할 수도 있습니다. 잘못된 서버 응답을 디버그하는 데 도움이 될 수 있는 터미널에서 HTTP 연결을 시작합니다.

친숙해지면 유용한 또 다른 도구는 strace입니다(linux에만 해당).

Strace는 앱이 수행하는 모든 시스템 호출을 표시합니다.

-e 옵션을 사용하여 특정 시스템 호출을 필터링할 수 있습니다. strace에 대한 보다 현대적인 대안은 sysdig입니다.

<블록 인용>

경고! 테스트 중인 시스템의 성능을 심각하게 저하시키므로 프로덕션 환경에서는 strace를 사용하지 않는 것이 좋습니다.

마지막으로, 외부 gem에서 발생한 것처럼 보이는 문제를 처리하고 있다면, gem의 소스 코드를 검사하는 것이 분명한 단계입니다.

보석 열기 을(를) 사용할 수 있습니다. 구성된 편집기에서 소스 코드를 여는 명령입니다.

결론

디버깅이 가장 재미있는 활동이 아니더라도 더 쉽게 만들 수 있는 도구와 기술이 많이 있으므로 이를 사용하여 도움을 받으세요.

더 많은 ppl이 배울 수 있도록 이 게시물을 즐겼다면 공유해 주세요! 🙂

감사합니다.