這絕對是可能的 - 事實上,甚至有一種方法!
set_trace_func proc { |event, file, line, id, binding, classname|
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
你想要的祕密武器來自Kernel#set_trace_func
,正如上面所指出的:就在你的代碼要開始記錄的東西點之前添加這個地方
- set_trace_func( PROC)=> PROC
- set_trace_func(無)=>無
將proc
設置爲跟蹤處理程序,如果參數爲nil
,則禁用跟蹤。 proc
最多需要六個參數:事件名稱,文件名,行號,對象ID,綁定和類名稱。每當發生事件時都會調用proc
。事件是:c-call
(調用C語言例程),c-return
(從C語言例程返回),call
(調用Ruby方法),class
(啓動類或模塊定義),end
(完成類或模塊定義),line
(在新行上執行代碼),raise
(引發異常)和return
(從Ruby方法返回)。跟蹤在proc的上下文中被禁用。
這裏有一個簡便的事例:
class Test
def test
a = 1
b = 2
end
end
set_trace_func proc { |event, file, line, id, binding, classname|
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
t = Test.new
t.test
(注意:除非你想文本的一個巨大的滾動屏幕不要嘗試這種在irb
)輸出結果是:
line test.rb:11 false
c-call test.rb:11 new Class
c-call test.rb:11 initialize Object
c-return test.rb:11 initialize Object
c-return test.rb:11 new Class
line test.rb:12 false
call test.rb:2 test Test
line test.rb:3 test Test
line test.rb:4 test Test
return test.rb:4 test Test
你可以使用上面的格式化字符串來獲得你想要記錄的結果(例如,聽起來你只對call
事件感興趣)。希望有所幫助,並祝你能夠在所有單元測試中排序!
你有沒有考慮一個靜態的分析,還是你只是尋找一個實際運行代碼的東西嗎? Doxygen輸出一些很好的調用者/被調用者圖形,並沒有看到它是否支持Ruby,但調用圖形可以證明對理解現有代碼非常有用。 – 2010-02-08 04:15:23
我相當確信Doxygen不支持Ruby - 如果確實如此,它肯定對我有用,但我找不到任何有關支持Ruby的Doxygen的信息。 我寧願有一些實際運行代碼的東西,主要是因爲處理require需求的順序會影響給定方法的多個(不同的)定義中的哪一個將被使用。 正如我所說,這是一個醜陋的代碼庫... – monch1962 2010-02-08 04:24:23