如何在Ruby 1.9中调试require?

3

根据The Tin Man的观点,我提出了一个新问题。

原始问题在此处:Rubygem如何要求所有gems?

我用于调试的原始代码:

require 'debugger'
debugger
require 'thor'

这里是一个两难的局面:

  1. 使用默认的-rdebug进行调试,无法进入Rubygem的源代码
  2. 使用debugger gem进行调试,需要在调试之前执行require(我在之前的问题中尝试过的方法,但是因为在我到达之前发生了一些重要的事情而不可接受)

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


你能否请提供一小段你要调试的代码示例? - mdesantis
请问如何使用RubyGem的require_all方法加载所有的gem? @ProGNOMmers - rhapsodyn
由于这个答案与其他答案不同,您可以将与此答案相关的代码复制到此处,以便该答案的理解不依赖于其他答案 :-) - mdesantis
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

如果你想使用 debugger gem 进行调试,仍然可以实现,但需要更加巧妙,因为你必须在不加载 Rubygems 的情况下加载 debugger。为了做到这一点,你需要手动设置你的加载路径,包括 Debugger 的 lib 目录以及任何 Debugger 依赖的 gem 的 lib 目录。当你使用已加载 Rubygems 的 require 'debugger' 命令时,这基本上就是 Rubygems 为你做的事情。
要确定 Debugger 需要哪些 libs,你可以使用以下命令:
 ruby -e "lp = $:.dup; gem 'debugger'; puts $: - lp"

这是一个小的Ruby脚本,首先复制了加载路径($:是加载路径,你也可以使用$LOAD_PATH),然后激活Debugger宝石,最后打印出新加载路径和原始加载路径之间的差异。这将给出激活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

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