Как отладить приложение rails (3.2), запущенное мастером?

Я пытаюсь использовать мастера для запуска моего приложения rails. К сожалению, у меня возникли трудности с подключением IDE для отладки.

Я прочитал здесь об использовании

Debugger.wait_connection = true
Debugger.start_remote

запустить сеанс удаленной отладки, но это не очень получается.

Вопрос: есть ли способ отладить приложение rails (3.2), запущенное бригадиром? Если да, то каков подход?


person jones    schedule 04.03.2012    source источник


Ответы (2)


Если вы используете несколько рабочих процессов с полной средой rails, вы можете использовать следующий инициализатор:

# Enabled debugger with foreman, see https://github.com/ddollar/foreman/issues/58
if Rails.env.development?
  require 'debugger'
  Debugger.wait_connection = true

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

  port = find_available_port
  puts "Remote debugger on port #{port}"
  Debugger.start_remote(nil, port)
end

А в логах бригадира вы сможете найти порты отладчика:

$ foreman start
12:48:42 web.1     | started with pid 29916
12:48:42 worker.1  | started with pid 29921
12:48:44 web.1     | I, [2012-10-30T12:48:44.810464 #29916]  INFO -- : listening on addr=0.0.0.0:5000 fd=10
12:48:44 web.1     | I, [2012-10-30T12:48:44.810636 #29916]  INFO -- : Refreshing Gem list
12:48:47 web.1     | Remote debugger on port 59269
12:48:48 worker.1  | Remote debugger on port 41301

Теперь запустите отладчик, используя:

rdebug -c -p [PORT]
person luacassus    schedule 30.10.2012
comment
Очевидно, вам нужно больше голосов. Благодаря вам я наконец-то заставил это работать. Спасибо! - person Jimmy; 10.04.2013
comment
Для полноты картины последним шагом будет подключение к отладчику в отдельной оболочке с помощью rails -c -p [PORT] - person Philipp; 07.05.2013
comment
@Philipp - Вы имели в виду rdebug -c -p [PORT]? Использование команды rails у меня не сработало. - person Tim Scott; 04.06.2013
comment
@ Тим, прости за это - да, должно быть rdebug. - person Philipp; 13.06.2013
comment
Итак, у меня это работает, однако мой процесс отладки завершается каждые 30 секунд, поскольку я использую сервер Unicorn и timeout 30 в моем файле конфигурации unicorn.rb. я пробовал несколько решений, чтобы изменить тайм-аут, если я нахожусь в среде разработки, но это не работает. вот код, который я пытаюсь: if ENV['development'] timeout 300 else timeout 30 end. Есть идеи, как заставить это работать на Unicorn/Foreman без таймаута только в dev env? Спасибо! я проголосовал за - person FireDragon; 27.12.2013
comment
Я решил тайм-аут Unicorn, используя Rails.env.development? вместо ENV['development'] - person Juanda; 17.01.2014

Один из подходов состоит в том, чтобы обычно требовать отладчика в вашем gemfile и добавлять debugger обычно в ваш код по мере необходимости. Когда сервер дойдет до этой строки, он остановится, но мастер не будет об этом подробно рассказывать. В консоли бригадира вы можете вслепую ввести irb, и только тогда появится приглашение. Плохой UX, верно?

Другой (дополнительный) подход заключается в том, чтобы следить за вашими журналами:

tail -f log/development.log

Надеюсь это поможет.

person Galen    schedule 10.08.2012