2014-09-30 42 views
1

我有一個奇怪的問題,我有一個模塊在我的Rails應用程序啓動過程中的某個時刻被神祕地定義,我無法弄清楚在哪裏。該模塊的名稱是CauseRails引導過程中模塊的跟蹤定義

我已經試過:

  • grepping爲class Causemodule Cause項目目錄沒有結果
  • pry版在config/application.rb每一步,並與Object.const_get('Cause')檢查......在所有該文件是的undefined(返回一個NameError: uninitialized constant Cause-這很好)
  • pry ed在我的第一個初始化程序,它在那裏定義。
  • 使用pry-byebug設置一個斷點,我會希望將停止的那一刻Cause執行中被定義,但它並沒有像下面的表達式:break if (Object.const_get('Cause') rescue false)

任何人有任何調試策略我都沒有試過嗎?如果Rails在定義好的時刻暫停在pry會話中,那將是非常棒的,但我無法弄清楚如何實現這一點。另外,在啓動過程中,config/application.rbconfig/initializers/*的評估之間是什麼? The Rails Guide關於這個問題似乎沒有提到config/initializers目錄...

希望對此有幫助。

+0

它可能來自您已安裝的其中一個寶石。你能向我們展示你在Gemfile中的寶石列表嗎? – infused 2014-09-30 20:22:10

+0

@infused已添加到帖子。 – neezer 2014-09-30 20:32:21

回答

0

你應該可以用tracepoint api來做到這一點。

trace = TracePoint.new(:class) do |tp| 
    puts "#{tp.self} defined at #{tp.path}:#{tp.lineno}" 
end 

trace.enable 

將在每個類被定義時產生輸出,並具有文件位置。在使用ruby 2.0之前,你可以使用set_trace_func,它具有大致相同的功能,但使用更加笨拙的api。

如果該類是在eval或類似的調用中定義的,則這不會產生非常有用的答案,但看起來應該仍然可以調用caller來獲取堆棧跟蹤。

+0

太棒了,謝謝! – neezer 2014-10-08 15:20:27

0

好吧,我想出了它使用的是什麼git bisect,並在我的代碼庫中追溯了幾個月......事實證明,違規者是gem 'cells'。現在,在單元代碼庫中進行深入研究,找出錯誤併發佈一個PR來修復它...

不過,如果有一種方法可以在定義模塊時暫停執行,爲我節省了大量的一分之二的時間。