根据the Tin Man
的意见,我提出了一个新问题。
原始问题在这里:How does Rubygem require all gems?
我用来调试的原始代码:
require 'debugger'
debugger
require 'thor'
这就是困境:
-rdebug
进行调试,我无法访问Rubygem的源代码debugger
gem进行调试,在调试之前我必须require
(我在前一个问题中尝试的方式,这是不可接受的,因为在我到达之前发生了一些重要的事情)希望找到一种调试IT的方法。
答案 0 :(得分:4)
需要rubygems
时replaces 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