Computer >> Máy Tính >  >> Lập trình >> Ruby

Gỡ lỗi từ xa với Byebug, Rails và Pow

Nếu bạn chưa từng thấy byebug trước đây, tôi khuyên bạn nên kiểm tra nó. Đó là một trình gỡ lỗi tuyệt vời cho Ruby 2.x. Theo lời của các tác giả của nó:

Byebug là một trình gỡ lỗi đơn giản, có nhiều tính năng cho Ruby 2. Nó sử dụng API TracePoint mới để kiểm soát thực thi và API Trình kiểm tra gỡ lỗi mới để điều hướng ngăn xếp cuộc gọi, vì vậy nó không phụ thuộc vào các nguồn lõi nội bộ. Nó được phát triển như một phần mở rộng C, vì vậy nó rất nhanh. Và nó có một bộ thử nghiệm đầy đủ nên rất đáng tin cậy.

Thiết lập cơ bản khá đơn giản. Chỉ cần cài đặt đá quý. Nếu bạn sử dụng byebug ở bất kỳ đâu trong mã của bạn, quá trình thực thi sẽ dừng lại tại thời điểm đó và bạn sẽ được đưa vào bảng điều khiển gỡ lỗi. Bạn có thể thiết lập nó để sử dụng pry.

Ví dụ:tôi có thể gọi trình gỡ lỗi như sau:

require 'byebug'

def my_method
  a = 1
  byebug
end

my_method()

Nếu tôi chạy tệp đó, tôi sẽ bị rơi vào trình gỡ lỗi.

Gỡ lỗi từ xa với Byebug, Rails và Pow Khi trình gỡ lỗi được kích hoạt, trình gỡ lỗi sẽ đưa bạn vào một trình bao tương tác.

Sự cố với Pow

Điều đó tốt nếu bạn có thể chạy ứng dụng của mình trên dòng lệnh. Nhưng điều gì sẽ xảy ra nếu bạn đang phát triển một ứng dụng Rails sử dụng pow để phục vụ nó cục bộ?

Pow, giống như hầu hết các máy chủ ứng dụng, chạy trong nền. Vì vậy, ngay cả khi bạn đã quản lý để dừng thực thi và chạy trình gỡ lỗi, bạn sẽ không thể tương tác với nó!

May mắn thay, byebug cung cấp một cơ chế để gỡ lỗi từ xa.

Nếu bạn không quen với gỡ lỗi từ xa, đó là một khái niệm đơn giản. Khi phương thức byebug được gọi, thay vì kết xuất bạn vào một trình bao tương tác, trình gỡ lỗi sẽ kích hoạt máy chủ đặc biệt của riêng nó. Sau đó, bạn có thể kết nối với máy chủ gỡ lỗi này bằng ứng dụng khách dòng lệnh.

Gỡ lỗi từ xa trông như thế nào?

Đầu tiên, tôi gọi phương thức byebug thành hành động của bộ điều khiển

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

Thứ hai, tôi yêu cầu hành động đó. Kết nối dường như bị treo.

Gỡ lỗi từ xa với Byebug, Rails và Pow Yêu cầu web kích hoạt trình gỡ lỗi không tải

Cuối cùng, tôi chuyển sang ứng dụng khách byebug của mình, ứng dụng này đang hiển thị bảng điều khiển trình gỡ lỗi tại chính xác điểm mà tôi đã chỉ định.

Gỡ lỗi từ xa với Byebug, Rails và Pow Trình gỡ lỗi từ xa byebug đang hoạt động

Thiết lập gỡ lỗi từ xa bằng byebug

Nếu bạn chưa cài đặt gem, hãy tiếp tục và cài đặt nó.

# Gemfile

gem "byebug", group: "development"

Tiếp theo, chúng ta cần thêm một trình khởi tạo vào ứng dụng rails để khởi động máy chủ byebug bất cứ khi nào pow khởi động ứng dụng rails của chúng tôi. Tùy chọn thực sự duy nhất bạn cần cung cấp là số cổng. Đoạn mã dưới đây cho phép bạn định cấu hình điều đó thông qua một biến môi trường.

Sau khi thêm trình khởi tạo này, có thể bạn sẽ cần khởi động lại ứng dụng để đảm bảo rằng ứng dụng đã được tải.

# config/initializers/byebug.rb

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

Cuối cùng, bạn sẽ cần chạy ứng dụng khách byebug và cho nó biết nơi tìm máy chủ của chúng tôi. Sau đó, khách hàng sẽ ngồi và chờ kích hoạt gỡ lỗi xảy ra.

Nếu bạn đã sử dụng một cổng khác, bạn sẽ cần phải thay thế cổng đó tại đây.

bundle exec byebug -R localhost:1048

Đó là nó! Đã đến lúc bắt đầu gỡ lỗi.