如何像调试Rails应用程序一样调试Sinatra应用程序?

31
在我的主要Sinatra控制器中,我想在表单提交后调试params哈希值。
我已经添加了:
puts params.inspect

并且

set :logging, :true

如果一切顺利,params.inspect可以正常工作。但是,如果在控制器执行之前发生错误,我将无法像默认情况下在Rails中那样获得有关错误的信息。

获取有用的调试信息的最佳方式是什么?

这个示例根本不起作用(在添加了此代码后,应用程序甚至无法启动):

configure do 
  Log = Logger.new("sinatra.log")
  Log.level  = Logger::INFO 
end

然后是:

Log.info "#{@users.inspect}"

1
raise params怎么样? - coderek
10个回答

20

您可以尝试添加一个“before filter”来打印参数。

before do
  puts '[Params]'
  p params
end

不得不在继承的Sinatra代码上完成此操作。在erb(或haml)文件中,在任何其他写入正文之前,使用<% p params %>。参数将出现在您的控制台中。 - Rico Rodriquez Collins

15

我认为在调试时应该使用:development配置,因为在这种情况下会打开一些调试标志。因此,在您的configure do块下,您可以启用这些标志:

enable :logging, :dump_errors, :raise_errors

并且针对您的日志记录设施:

log = File.new("sinatra.log", "a")
STDOUT.reopen(log)
STDERR.reopen(log)

来自Sinatra手册:

  • dump_errors选项控制当路由中出现异常时,backtrace是否会被转储到rack.errors中。对于顶级应用程序,默认情况下启用此选项。

  • raise_errors - 允许异常在应用程序外部传播 (...) 对于传统应用程序风格,:raise_errors选项默认处于禁用状态;对于Sinatra::Base子类,默认情况下启用此选项。

我也使用了

puts "something" + myvar.inspect

在我的控制器中间有一个方法。


10

正如@jshen所说,ruby-debug是一个非常不错的工具 - 只要你使用的是Ruby 1.8。

为了在Sinatra中使用它,请插入

require 'ruby-debug/debugger' 

您希望调试开始的位置。


8
我建议使用Pry或Ruby调试器。使用Pry,您可以像在bash中一样使用命令行遍历方法和变量。
请参见“如何在Sinatra中使用Pry?”。

这是目前为止可用于调试Sinatra应用程序的最有用的方法。 - three

4
为了找到调试 Sinatra 应用程序的最佳方法,我在 GitHub 上创建了一个仓库。其中最有用的部分是 step into method debug,它看起来如下所示。

enter image description here

这里是代码库链接: https://github.com/hlee/sinatra_debugger_example


3

我强烈建议在Ruby 1.8中使用ruby-debug。一旦学会了四五个基本命令,它非常容易设置和使用。它允许您在想要检查参数并交互式地像在IRB中一样操作时设置断点。


2

Sinatra中的Ruby调试器

您可以自由地在Sinatra中使用Ruby调试器。主要问题是您需要知道哪个Ruby Gem用于哪个Ruby版本。对于大多数人来说,现在意味着Ruby 2.X和byebug

按Ruby版本分类的Ruby调试器

 Ruby Version   Gem Install      require                add breakpoint
 ---------------------------------------------------------------------
 1.8.X          ruby-debug      'ruby-debug/debugger'   debugger
 1.9.X          debugger        'debugger'              debugger
 2.0.0+         byebug          'byebug'                byebug

一旦你知道必须安装gem,就在你的代码中引用它,然后通过输入关键字来添加断点。以byebug为例:
  1. 安装:gem install byebug
  2. 引用:require 'byebug'
  3. 断点:byebug

进一步阅读

Byebug项目

Byebug使用终端调试器指南


1

我猜想你提到了你的主要Sinatra控制器,那就意味着你有不止一个控制器,这也就意味着你正在使用子类化(subclassing)Sinatra::Base而不是使用经典(top-level)的Sinatra应用程序。如果确实是这种情况,那么默认的很多错误处理都会被禁用。

如果你在类定义中包含set :show_exceptions, true if development?,你将得到友好的错误页面,其中包括堆栈跟踪、参数等,而不仅仅是内部服务器错误。另一种选择是set :raise_errors, false,然后包含一个error do...end块,当你的路由之一引发错误时,它将运行。


1

这个链接已经失效了。 - Akshay
1
回答时附上链接很重要,但需要将最重要的部分复制到答案中,并给出适当的归属和链接。链接会失效,导致答案毫无价值。 - the Tin Man

1
我建议在 Ruby 1.9 中使用 debugger gem。
要将其用于您的 Sinatra 应用程序:
  1. 将gem添加到您的Gemfile中

    gem "debugger"
    
  2. 通过运行以下命令来安装gem

    bundle
    
  3. 在您的主sinatra应用文件中添加

    require 'debugger'
    
  4. 现在,要进行调试,您只需在代码中任何位置添加以下行

    debugger
    

当代码正在执行并且出现debugger时,代码会停止,您可以检查变量、运行命令(使用eval)等。

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