2013-04-17 49 views
1

根据the Tin Man的意见,我提出了一个新问题。如何在Ruby 1.9中调试需求

原来的问题就在这里:How does Rubygem require all gems?

原始代码我用来调试:

require 'debugger' 
debugger 
require 'thor' 

这里的两难境地:

  1. 调试使用默认-rdebug,我不能去Rubygem的源代码
  2. 调试debugger宝石,我必须require我调试之前(我在上一个问题中尝试的方式,这是不可接受的,因为在我到达那里之前发生了一些重要事情)

希望找到调试IT的方法。

+0

能否请你做的一个小例子你想调试的代码? – mdesantis

+0

http://stackoverflow.com/questions/16063144/how-does-rubygem-require-all-gems @ProGNOMmers – rhapsodyn

+0

由于这个答案不同于另一个,你可以在这里复制与这个答案相关的代码,所以对这个答案的理解不依赖于另一个:-) – mdesantis

回答

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。这可以通过ruby可执行文件(文档记录不完整)--disable-gems选项禁用。在明确调用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为您调试它仍然是可能的,但棘手的一点,你必须加载debugger无需加载RubyGems的。为了做到这一点,您需要手动设置加载路径以包含Debugger的lib目录,以及Debugger依赖的任何Gem的lib目录。这基本上是Rubygems为您加载Rubygems时调用require 'debugger'所做的。

要确定调试器需要什么库,你可以使用这个命令:

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

这是小的Ruby脚本,首先把负载路径的副本($:是负载路径,也可以使用$LOAD_PATH ),然后激活调试器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