3

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

原始问题在这里:Rubygem 如何需要所有宝石?

我用来调试的原始代码:

require 'debugger'
debugger
require 'thor'

这是困境:

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

希望能找到调试IT的方法。

4

1 回答 1

5

rubygems需要时,它会用自己的方法替换 Ruby 的Kernel.require方法,在已安装的 gems 中搜索所需的文件。与 Ruby 1.9 及更高版本的集成基本上是在启动期间调用require 'rubygems'。这可以通过可执行文件的(记录不--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

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

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

 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

您现在可以使用它来创建脚本以使用 Debugger 进行调试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
于 2013-04-17T20:04:39.083 回答