【问题标题】:Debugging Sinatra application调试 Sinatra 应用程序
【发布时间】:2012-12-10 01:39:56
【问题描述】:

我安装了 pry 并尝试使用它。

gem "pry"    

require 'pry'
#..........
binding.pry

但是有3个问题:

  • 我不知道是转到下一个字符串(而不是下一个断点)还是观察变量的值。 没有任何信息
  • 有很多不同的撬块! pry-debug、pry、pry-db 等等。我应该使用哪一个?
  • 它应该停在那里。但我还不知道(也没有找到)如何查看变量的值或如何转到下一行。它总是在几秒钟内给出以下错误:
pry(#)> 错误:执行已过期 /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:600:in `getbyte' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:600:in `readline' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:600:in `block in readline' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:544:in `handle_read_errors' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:589:in `readline' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:369:in `retrieve_line' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:304:in `block in r' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:301:in `loop' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:301:in `r' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:271:in `re' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:251:in `rep' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:231:in `repl 中的块(3 级)' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:230:in `loop' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:230:in `repl 中的块(2 级)' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:229:in `catch' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:229:in `block in repl' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:228:in `catch' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_instance.rb:228:in `repl' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/pry_class.rb:154:in `start' /var/lib/gems/1.9.1/gems/pry-0.9.10/lib/pry/core_extensions.rb:22:in `pry' /home/alex/Documents/ruby/my_projects/controllers/my_controller.rb:24:in `block in ' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1265:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1265:in `block in compile!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:835:in `[]' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:835:in `block (3 levels) in route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:851:in `route_eval' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:835:in `block (2 levels) in route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:872:in `block in process_route' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:870:in `catch' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:870:in `process_route' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:834:in `block in route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:833:in `每个' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:833:in `route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:936:in `dispatch!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:769:in `block in call!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:921:in `block in invoke' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:921:in `catch' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:921:in `invoke' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:769:in `call!' /home/alex/Documents/ruby/my_projects/app.rb:21:in `block in ' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1265:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1265:in `block in compile!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:835:in `[]' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:835:in `block (3 levels) in route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:851:in `route_eval' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:835:in `block (2 levels) in route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:872:in `block in process_route' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:870:in `catch' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:870:in `process_route' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:834:in `block in route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:833:in `每个' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:833:in `route!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:936:in `dispatch!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:769:in `block in call!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:921:in `block in invoke' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:921:in `catch' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:921:in `invoke' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:769:in `call!' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:755:in `call' /var/lib/gems/1.9.1/gems/rack-flash3-1.0.1/lib/rack/flash.rb:120:in `call' /var/lib/gems/1.9.1/gems/rack-timeout-0.0.3/lib/rack/timeout.rb:16:in `block in call' /usr/lib/ruby/1.9.1/timeout.rb:68:in `timeout' /var/lib/gems/1.9.1/gems/rack-timeout-0.0.3/lib/rack/timeout.rb:16:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:in `context' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in `call' /var/lib/gems/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22:in `call' /var/lib/gems/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/path_traversal.rb:16:in `call' /var/lib/gems/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/json_csrf.rb:17:in `call' /var/lib/gems/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/base.rb:47:in `call' /var/lib/gems/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/logger.rb:15:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:129:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/head.rb:9:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/showexceptions.rb:21:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:99:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1389:in `block in call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1471:在“同步”中 /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:1389:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/builder.rb:134:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/urlmap.rb:64:in `block in call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/urlmap.rb:49:in `each' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/urlmap.rb:49:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/lint.rb:48:in `_call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/lint.rb:36:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/showexceptions.rb:24:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/commonlogger.rb:20:in `call' /var/lib/gems/1.9.1/gems/sinatra-1.3.3/lib/sinatra/base.rb:136:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/chunked.rb:43:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/content_length.rb:14:in `call' /var/lib/gems/1.9.1/gems/rack-1.4.1/lib/rack/handler/webrick.rb:59:in `服务' /usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `服务' /usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:在“运行”中 /usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' 撬(#)>

好的,我安装

gem "debugger"

并添加断点

debugger

什么都没有发生。

日志文件不是我要找的。我只想调试一个 Sinatra 应用程序。我该怎么做?

【问题讨论】:

    标签: ruby debugging sinatra rack


    【解决方案1】:

    在您的 Gemfile 中:

    gem "pry"
    gem "pry-nav"
    

    运行捆绑包。然后每当脚本遇到binding.pry,你就会打开一个shell。您可以使用whereami 查看您所在的位置,使用next 移动到下一行,使用continue 继续运行脚本。如果你想检查一个变量,只需输入它的名字。

    请参阅pry-nav 了解更多信息。

    【讨论】:

    • 撬导航?撬,撬调试,撬数据库...?为什么不能只用pry来调试?
    • 其实最好使用pry-debugger(如果可以的话),因为它比pry-nav更可靠
    • 如果我不想再调试了,该怎么做呢? Continue 只是将我重定向到下一个断点,next -- 到下一行。
    • @banister 不确定。 pry-debugger 带来了很多依赖(debugger-linecache, debugger, debugger-ruby_core_source, ...),其中一些也是原生的。对于我的工作流程(断点/检查/下一步/步骤/继续),我真的不需要。
    • @AlanDert Continue 让您返回程序执行,如果还有另一个 binding.pry 您正在再次调试 - 我不知道您如何告诉 pry 跳过下一个 binding.prys...如果这有帮助,您可以直接按 ctrl+d 而不是输入 continue...
    【解决方案2】:

    pry-debugger 更好。并且您需要在模块化样式下运行 sinatra 应用程序。

    我在 github 创建了一个 repo,它解释了如何使用 pry 进行调试。

    这里是回购:https://github.com/hlee/sinatra_debugger_example

    pry-debugger 和 pry-nav 的区别

    撬调试器

    如果你查看 pry-debugger 的源代码,你会看到:

    # pry-debugger.gemspec
    # Dependencies
    gem.required_ruby_version = '>= 1.9.2'
    gem.add_runtime_dependency 'pry', '>= 0.9.10'
    gem.add_runtime_dependency 'debugger', '~> 1.3'
    gem.add_development_dependency 'pry-remote', '~> 0.1.6'
    

    这意味着,pry-debugger 仅支持 MRI 1.9.2 和 1.9.3。由于它依赖于调试器,Pry-debugger 将支持更快的跟踪、断点等。

    撬导航

    另一方面,这里是 pry-nav 来源:

    # pry-nav.gemspec
    # Dependencies
    gem.required_ruby_version = '>= 1.8.7'
    gem.add_runtime_dependency 'pry', '~> 0.9.10'
    gem.add_development_dependency 'pry-remote', '~> 0.1.6'
    

    也就是说,pry-nav 是一种纯 ruby​​ 方法,不依赖于调试器。将支持 1.8.7,不支持断点和调试器的一些其他功能。

    断点

    break SomeClass#run           # Break at the start of `SomeClass#run`.
    break Foo#bar if baz?         # Break at `Foo#bar` only if `baz?`.
    break app/models/user.rb:15   # Break at line 15 in user.rb.
    break 14                      # Break at line 14 in the current file.
    
    break --condition 4 x > 2     # Change condition on breakpoint #4 to 'x > 2'.
    break --condition 3           # Remove the condition on breakpoint #3.
    
    break --delete 5              # Delete breakpoint #5.
    break --disable-all           # Disable all breakpoints.
    
    break                         # List all breakpoints. (Same as `breakpoints`)
    break --show 2                # Show details about breakpoint #2.
    

    注意

    pry-nav 和 pry-debugger 不能一起加载。

    【讨论】:

    • 它和pry+pry_nav有什么区别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多