如何在Ruby 1.9中调试require?[英] How can I debug require in Ruby 1.9

本文是小编为大家收集整理的关于如何在Ruby 1.9中调试require?的处理方法,想解了如何在Ruby 1.9中调试require?的问题怎么解决?如何在Ruby 1.9中调试require?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

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

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

我用来调试的原始代码:

require 'debugger'
debugger
require 'thor'

这是两难境地:

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

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

推荐答案

当需要 rubygems 时 用它自己的方法替换 Ruby 的 Kernel.require 方法,在已安装的 gems 中搜索所需的文件.与 Ruby 1.9 及更高版本的集成基本上是 在启动期间调用 require 'rubygems'向上.这可以通过 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 进行调试,它仍然是可能的,但有点棘手因为您必须在不加载 Rubygems 的情况下加载 debugger .为此,您需要手动设置加载路径以包含 Debugger 的 lib 目录,以及 Debugger 所依赖的任何 gem 的 lib 目录.这基本上是 Rubygems 在加载 Rubygems 的情况下调用 require '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

您现在可以使用它来创建一个脚本来使用 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

本文地址:https://www.itbaoku.cn/post/786362.html