我如何在Ruby 1.9中调试require

时间:2013-04-17 15:49:37

标签: ruby rubygems

根据the Tin Man的意见,我提出了一个新问题。

原始问题在这里:How does Rubygem require all gems?

我用来调试的原始代码:

require 'debugger'
debugger
require 'thor'

这就是困境:

  1. 使用默认-rdebug进行调试,我无法访问Rubygem的源代码
  2. 使用debugger gem进行调试,在调试之前我必须require(我在前一个问题中尝试的方式,这是不可接受的,因为在我到达之前发生了一些重要的事情)
  3. 希望找到一种调试IT的方法。

1 个答案:

答案 0 :(得分:4)

需要rubygemsreplaces Ruby’s Kernel.require method with its own that searches for required files in the installed gems。与Ruby 1.9及更高版本的集成基本上是call to require 'rubygems' during start up。可以使用--disable-gems可执行文件的ruby选项(文档记录不足)禁用此功能。在明确调用require 'rubygems'之前,您可以使用它来设置调试。

# start with ruby --disable-gems
require 'debug' #standard library debug - doesn't load rubygems

require 'rubygems' #now you can debug this

如果你想使用debugger gem进行调试,它仍然可能,但有点棘手,因为你必须在不加载Rubygems的情况下加载debugger。为此,您需要手动设置加载路径以包含Debugger的lib目录,以及Debugger所依赖的任何gems的lib目录。这基本上是当你用加载的Rubygems调用require 'debugger'时,Rubygems为你做的。

要确定libs Debugger需要什么,可以使用以下命令:

 ruby -e "lp = $:.dup; gem 'debugger'; puts $: - lp"

这是一个小Ruby脚本,它首先获取加载路径的副本($:是加载路径,你也可以使用$LOAD_PATH),然后激活Debugger gem,然后打印出差异在新的加载路径和原始路径之间。这将为您提供激活debugger添加到加载路径的目录。

在我的机器上,这看起来像这样:

$ ruby -e "lp = $:.dup; gem 'debugger'; puts $: - lp"
/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/columnize-0.3.6/lib
/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-ruby_core_source-1.2.0/lib
/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-linecache-1.2.0/lib
/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-1.5.0/lib

您现在可以使用它来创建脚本以使用调试器来调试require 'rubygems'

# start with ruby --disable-gems

# set up the load path without loading rubygems
$:.unshift '/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/columnize-0.3.6/lib'
$:.unshift '/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-ruby_core_source-1.2.0/lib'
$:.unshift '/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-linecache-1.2.0/lib'
$:.unshift '/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-1.5.0/lib'

# require debugger and start it
require 'debugger'
debugger

require "rubygems" #now you can debug this with debugger