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

Byebug, Rails 및 Pow를 사용한 원격 디버깅

아직 바이버그를 안 보신 분들이 계시다면 꼭 보시길 추천합니다. Ruby 2.x를 위한 훌륭한 디버거입니다. 저자의 말:

Byebug는 사용이 간편하고 Ruby 2용 기능이 풍부한 디버거입니다. 실행 제어를 위한 새로운 TracePoint API와 호출 스택 탐색을 위한 새로운 Debug Inspector API를 사용하므로 내부 핵심 소스에 의존하지 않습니다. C 확장으로 개발되어 속도가 빠릅니다. 또한 전체 테스트 제품군이 있으므로 신뢰할 수 있습니다.

기본 설정은 꽤 간단합니다. 젬을 설치하면 됩니다. byebug를 사용하는 경우 코드의 아무 곳에서나 메서드를 실행하면 해당 지점에서 실행이 중지되고 디버그 콘솔로 이동하게 됩니다. pry를 사용하도록 설정할 수 있습니다.

예를 들어 다음과 같이 디버거를 호출할 수 있습니다.

require 'byebug'

def my_method
  a = 1
  byebug
end

my_method()

해당 파일을 실행하면 디버거에 빠지게 됩니다.

Byebug, Rails 및 Pow를 사용한 원격 디버깅 디버거가 실행되면 대화형 셸로 이동합니다.

Pow 문제

명령줄에서 앱을 실행할 수 있다면 괜찮습니다. 하지만 pow를 사용하여 로컬에서 제공하는 Rails 앱을 개발하고 있다면 어떻게 될까요?

Pow는 대부분의 앱 서버와 마찬가지로 백그라운드에서 실행됩니다. 따라서 실행을 중지하고 디버거를 실행하더라도 상호 작용할 수 없습니다!

다행히 byebug는 원격 디버깅을 위한 메커니즘을 제공합니다.

원격 디버깅에 익숙하지 않다면 간단한 개념입니다. byebug 메서드가 호출되면 대화형 셸로 사용자를 덤프하는 대신 디버거가 자체 특수 서버를 실행합니다. 그런 다음 명령줄 클라이언트를 사용하여 이 디버그 서버에 연결할 수 있습니다.

원격 디버깅은 어떤 모습인가요?

먼저 컨트롤러 작업에 대한 byebug 메서드를 호출합니다.

class PagesController < ApplicationController
  def index
    if user_has_never_signed_in? && request.subdomain == "www"
      @hero_bg = ab_test("hero_bg", "control", "variable")
    else
      @hero_bg = "control"
    end

    byebug

  end
end

둘째, 나는 그 행동을 요청합니다. 연결이 끊긴 것 같습니다.

Byebug, Rails 및 Pow를 사용한 원격 디버깅 디버거를 트리거하는 웹 요청이 로드되지 않음

마지막으로, 정확히 내가 지정한 지점에 디버거 콘솔을 표시하는 byebug 클라이언트로 전환합니다.

Byebug, Rails 및 Pow를 사용한 원격 디버깅 작동 중인 byebug 원격 디버거

byebug로 원격 디버깅 설정

gem이 아직 설치되어 있지 않다면 설치를 진행하세요.

# Gemfile

gem "byebug", group: "development"

다음으로 pow가 레일 앱을 시작할 때마다 byebug 서버를 시작하는 이니셜라이저를 레일 앱에 추가해야 합니다. 제공해야 하는 유일한 실제 옵션은 포트 번호입니다. 아래 코드를 사용하면 환경 변수를 통해 이를 구성할 수 있습니다.

이 이니셜라이저를 추가하면 앱을 다시 시작하여 로드되었는지 확인해야 합니다.

# config/initializers/byebug.rb

if Rails.env.development?
  Byebug.start_server 'localhost', ENV.fetch("BYEBUG_SERVER_PORT", 1048).to_i
end

마지막으로 bybug 클라이언트를 실행하고 서버를 찾을 위치를 알려야 합니다. 그런 다음 클라이언트는 앉아서 디버그 트리거가 발생할 때까지 기다립니다.

다른 포트를 사용한 경우 여기에서 대체해야 합니다.

bundle exec byebug -R localhost:1048

그게 다야! 디버깅을 시작할 시간입니다.