这绝对是可能的 - 事实上,甚至有一种方法!
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