Sinatra应用程序调试

3

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

gem "pry"    

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

但是有3个问题:

  • 我不知道如何进入下一个字符串(而不是下一个断点)或查看变量的值。这方面没有信息
  • 有很多不同的prys!pry-debug、pry、pry-db等等。我应该使用哪一个?
  • 它停在那里就好了。但我还不知道(也没有找到)如何查看变量的值或如何进入下一行。并且它总是在几秒钟内给出以下错误:
pry(#)> Error: execution expired
/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 `block (3 levels) in repl'
/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 `block (2 levels) in repl'
/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 `each'
/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 `each'
/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:in `synchronize'
/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 `service'
/usr/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
/usr/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
/usr/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'
pry(#)> 

Alright, I install

gem "debugger"

并添加断点

debugger

什么都没有发生。

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

2个回答

6

在您的 Gemfile 中:

gem "pry"
gem "pry-nav"

运行bundle。每当脚本遇到binding.pry时,会打开一个shell。你可以用whereami命令查看当前位置,在下一行使用next命令,继续运行脚本请使用continue命令。如果你想检查一个变量,只需要输入它的名称即可。
更多信息请参见pry-nav

pry-nav?pry,pry-debug,pry-db...?为什么我不能只用 pry 进行调试? - Alan Coromano
1
实际上,最好使用pry-debugger(如果可以的话),因为它比pry-nav更可靠。 - horseyguy
如果我在 pry 中,不想再进行调试了,如何退出 pry?使用 continue 只会将我重定向到下一个断点,next 命令则会跳转到下一行。 - Alan Coromano
@banister 不确定。pry-debugger带来了很多依赖项(debugger-linecache、debugger、debugger-ruby_core_source等),其中一些也是本地的。对于我的工作流程(断点/检查/下一个/步骤/继续),我并不真正需要它们。 - Jiří Pospíšil
@AlanDert,继续执行会返回到程序执行,并且如果有另一个 binding.pry,则您将再次进行调试 - 我不确定如何告诉 pry 跳过下一个 binding.pry... 如果有帮助的话,您可以直接按 ctrl+d 而不是输入 continue... - Jiří Pospíšil

3

使用pry-debugger会更好。你需要以模块化的方式运行sinatra应用程序。

我在github上创建了一个仓库,其中解释了如何使用pry进行调试。

enter image description here

这是该仓库:https://github.com/hlee/sinatra_debugger_example

pry-debugger和pry-nav之间的区别

pry-debugger

如果您检查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。由于它依赖于debugger,Pry-debugger将支持更快的跟踪、断点等功能。

Pry-nav

另一方面,这里是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有什么区别? - Alan Coromano

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