如何在使用Sidekiq和Foreman时使用Byebug

16

我有一个Rails应用程序,使用foreman启动我的rails和sidekiq服务器。由于foreman不能与常规的byebug良好交互(无法在键入时看到提示),因此我为我的rails和sidekiq服务器设置了远程调试。这对于rails服务器完美运行,但是当我连接到sidekiq服务器的byebug服务器时,我会收到以下消息:

$ bundle exec byebug -R localhost:58501
Connecting to byebug server localhost:58501...
Connected.
(byebug:ctrl)

我无法捕获任何byebug断点。

根据文档,(byebug:ctrl)提示意味着程序已正常终止 (https://github.com/deivid-rodriguez/byebug/blob/master/GUIDE.md),但是sidekiq可以正常运行作业。

我的配置有问题吗,还是sidekiq不支持byebug的远程调试?

Procfile:

sidekiq: bundle exec sidekiq
rails: rails server

config/initializers/byebug.rb:

if Rails.env.development?
  require 'byebug'

  def find_available_port
    server = TCPServer.new(nil, 0)
    server.addr[1]
  ensure
    server.close if server
  end

  port = find_available_port

  puts "Starting remote debugger..."
  Byebug.start_server 'localhost', port
  puts "Remote debugger on port #{port}"
end
请注意,如果我不使用远程调试,那么byebug与sidekiq一起使用是可以正常运行的(尽管在foreman中,我无法看到我输入时的提示符)。
另请注意,我已经尝试在Byebug.start_server之前使用Byebug.wait_connection = true,但我仍然遇到了同样的问题。

你最终解决了这个问题吗?我实施了你的解决方案,只是为了让byebug远程调试在rails服务器上与heroku本地工作,但它使我的服务器变得非常缓慢,而且heroku本地几乎无法响应。你是否也遇到过这个问题? - Lorenz
我建议在本地使用内联作业执行,因为resque或sidekiq是很大的开发负担。但这并不是真正的答案,只是一个建议。 - Kkulikovskis
不是针对你的问题的答案,但它将解决你的问题:https://github.com/Mon-Ouie/pry-remote - medik
1个回答

3

我已经尝试在本地复制此操作,使用的是sidekiq 3.3.1和byebug 9.0.5,在稍微调整一下require后,似乎可以正常工作:

require 'byebug/core'

def find_available_port
  server = TCPServer.new(nil, 0)
  server.addr[1]
ensure
  server.close if server
end

port = find_available_port

puts "Starting remote debugger..."
Byebug.start_server 'localhost', port
puts "Remote debugger on port #{port}"

职位:

class TestJob
  include Sidekiq::Worker

  def perform
    byebug
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接