如何将Ruby / Rails Windows守护程序转换为可以调试的应用程序?

时间:2013-05-06 06:17:22

标签: ruby-on-rails ruby-on-rails-3

我目前将以下内容作为Windows服务的“可执行文件路径”。

我想了解如何将其转换为命令行应用程序,以便我可以交互式调试它。

Windows服务可执行文件的路径:“C:\ LONG_PATH_1 \ ruby​​ \ bin \ ruby​​XXXX_console.exe”“C:\ LONGPATH_2 \ windows_script.rb”

windows_script.rb如下:

# console_windows.rb
#
# Windows-specific service code.

# redirect stdout / stderr to file, else Windows Services will crash on output
$stdout.reopen File.open(File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..',
      'log', 'XXXX_console.output')), 'a')
$stderr.reopen $stdout
$stdout.sync = true
$stderr.sync = true

require File.join(File.dirname(File.expand_path(__FILE__)),"script_helper.rb")

require 'rubygems'
require 'win32/daemon'
include Win32

class BackgroundWindowsDaemon < Daemon

  def service_init
    # Do startup in service_main so that Windows Services doesn't timeout during startup
  end

  def service_main
    BackgroundScriptHelper.request_start
    BackgroundScriptHelper.monitor
  end

  def service_stop
    BackgroundScriptHelper.request_stop
  end

end

BackgroundWindowsDaemon.new.mainloop

1 个答案:

答案 0 :(得分:1)

安装ruby调试器gem

gem install debugger

或者将gem添加到您的Gemfile中,例如,如果脚本位于/ lib文件夹中,或者类似的话。

如果您在安装过程中遇到问题,这些答案可能会对您有所帮助:Cannot install ruby-debug gem on Windows

在脚本中需要调试器

require 'rubygems'
require 'win32/daemon'
include Win32
require "debugger"

class BackgroundWindowsDaemon < Daemon

  def first_method
    puts "i am doing something"
  end

  def second_method
    puts "this is something I want debug now"
    # your code is here..
    foo = {}
    debugger
    foo = { :bar => "foobar" }
  end

  # more code and stuff...

end

现在,如果您运行脚本并调用“second_method”,您的脚本将停在您编写“debugger”的行。现在您可以输入“irb”并启动普通控制台。您可以访问控制台中的所有本地内容,在此示例中,您可以输入“foo”和=&gt; {}将显示结果。

我必须在这里添加,我从未在Windows上安装gem,仅在Linux和Mac上安装。但我认为通过这些步骤你可以得到一个想法。你明白了吗?

有关调试的更多信息可以在这里找到:http://guides.rubyonrails.org/debugging_rails_applications.html看看这个,有更多关于Rails和Ruby 2.0的调试。

由于Rails自Rails 2.0以来已经内置了对ruby-debug的支持。在任何Rails应用程序中,您可以通过调用调试器方法来调用调试器。