根据the Tin Man的意见,我提出一个新问题。
最初的问题在这里:Rubygem 如何需要所有宝石?
我用来调试的原始代码:
require 'debugger'
debugger
require 'thor'
Run Code Online (Sandbox Code Playgroud)
这是一个两难的境地:
-rdebug,我无法转到Rubygem的源代码debugger,我必须require在调试之前进行(我在上一个问题中尝试的方式,这是不可接受的,因为在我到达那里之前发生了一些重要的事情)希望找到一种调试IT的方法。
当rubygems需要时,它会用自己的方法替换 Ruby\xe2\x80\x99sKernel.require方法,在已安装的 gems 中搜索所需的文件。与 Ruby 1.9 及更高版本的集成基本上是在启动期间调用require \'rubygems\'. --disable-gems可以使用可执行文件的(记录不详)选项来禁用此功能ruby。您可以在显式调用之前利用它来设置调试require \'rubygems\'。
# start with ruby --disable-gems\nrequire \'debug\' #standard library debug - doesn\'t load rubygems\n\nrequire \'rubygems\' #now you can debug this\nRun Code Online (Sandbox Code Playgroud)\n\n如果您想使用debuggergem进行调试,\xe2\x80\x99s 仍然可以,但有点棘手,因为您必须在debugger不加载 Rubygems 的情况下进行加载。为了做到这一点,您\xe2\x80\x99需要手动设置加载路径以包括Debugger\xe2\x80\x99s lib目录,以及调试器所依赖的任何gems的lib目录。当您调用require \'debugger\'加载的 Rubygems 时,这基本上就是 Rubygems 为您所做的事情。
要确定调试器需要哪些库,可以使用以下命令:
\n\n ruby -e "lp = $:.dup; gem \'debugger\'; puts $: - lp"\nRun Code Online (Sandbox Code Playgroud)\n\n这是一个小 Ruby 脚本,它首先获取加载路径的副本($:是加载路径,您也可以使用$LOAD_PATH),然后激活 Debugger gem,然后打印出新加载路径与原始加载路径之间的差异。debugger这将为您提供激活添加到加载路径的目录。
在我的机器上,它看起来像这样:
\n\n$ ruby -e "lp = $:.dup; gem \'debugger\'; puts $: - lp"\n/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/columnize-0.3.6/lib\n/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-ruby_core_source-1.2.0/lib\n/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-linecache-1.2.0/lib\n/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-1.5.0/lib\nRun Code Online (Sandbox Code Playgroud)\n\n您现在可以使用它创建一个脚本以使用调试器进行调试require \'rubygems\':
# start with ruby --disable-gems\n\n# set up the load path without loading rubygems\n$:.unshift \'/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/columnize-0.3.6/lib\'\n$:.unshift \'/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-ruby_core_source-1.2.0/lib\'\n$:.unshift \'/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-linecache-1.2.0/lib\'\n$:.unshift \'/Users/matt/.rvm/gems/ruby-1.9.3-p385/gems/debugger-1.5.0/lib\'\n\n# require debugger and start it\nrequire \'debugger\'\ndebugger\n\nrequire "rubygems" #now you can debug this with debugger\nRun Code Online (Sandbox Code Playgroud)\n