[英]How can I debug require in Ruby 1.9
根據the Tin Man
的意見,我提出了一個新問題。
原始問題在這里: Rubygem如何要求所有寶石?
我用來調試的原始代碼:
require 'debugger'
debugger
require 'thor'
這是兩難選擇:
-rdebug
調試,我無法使用Rubygem的源代碼 debugger
gem進行debugger
,我必須在調試之前進行require
(我在上一個問題中嘗試的方式,這是不可接受的,因為在到達那里之前發生了重要的事情) 希望找到一種調試IT的方法。
當需要rubygems
時,它將用自己的Ruby方法替換Ruby的Kernel.require
方法,該方法在已安裝的gems中搜索所需的文件 。 與Ruby 1.9及更高版本的集成基本上是在啟動過程中require 'rubygems'
的調用 。 可以使用ruby
可執行文件的(disable --disable-gems
) --disable-gems
disable --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進行調試,仍然可以,但是要復雜一些,因為您必須加載debugger
而不加載Rubygems。 為此,您需要手動設置加載路徑以包括Debugger的lib目錄以及Debugger依賴的任何gem的lib目錄。 從本質上講,這就是Rubygems在您調用require 'debugger'
且加載了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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.