我继承了一大堆Ruby代码,坦率地说,对于像我这样的凡人来说,这些代码几乎是不可能理解的。实际上,这些代码是Rspec单元测试代码,但其结构"非常不寻常"。
我希望能够运行代码,并将以下信息记录在某个位置:
- 每个被调用的方法,包括定义该方法的类名,以及定义被调用方法的文件名(是的,我们在多个不同的文件中定义了相同的类/方法,很难知道哪个被调用)
- (可选)传递给调用的每个方法的参数
有了它,我就可以开始尝试重构它了,没有它,由于代码库的大小(20k+单元测试用例),要理顺它将是一项非常困难的任务。
我无法对正在运行的代码进行大规模的编辑,因为即使你使用了苛刻的语言,它也会崩溃(例如频繁地)。相反,我需要能够在现有状态下插入代码,或者对现有状态进行最小的更改。
有没有一种方法可以在不对代码库进行大规模修改的情况下记录这种级别的细节呢?我已经看过Ruby分析器,看看它是否有帮助,它可能有帮助;我很好奇是否有更好的方法(特别是记录包含被调用方法的文件名)。
先谢了
3条答案
按热度按时间4nkexdtk1#
这绝对是可能的--事实上,甚至有一个方法可以实现它!只要在你的代码中你想开始记录事情之前的某个地方添加这个方法:
您想要的秘密酱料来自**
Kernel#set_trace_func
**,如上所述:将
proc
建立为跟踪的处理程序,如果参数为nil
,则禁用跟踪。proc
最多使用六个参数:事件名称、文件名、行号、对象ID、绑定和类名。每当事件发生时,都会调用proc
。事件包括:c-call
(调用C语言例程),c-return
(从C语言例程返回),call
(调用Ruby方法),class
(开始类或模块定义),end
(完成类或模块定义),line
(在新行上执行代码)、raise
(引发异常)和return
(从Ruby方法返回)。在proc的上下文中禁用跟踪。下面是一个简单的例子:
(Note:不要在
irb
中尝试此操作,除非您想要一个巨大的文本滚动屏幕。)结果输出为:您可以随意使用上面的格式化字符串,以获得您想要记录的结果(例如,听起来您只对
call
事件感兴趣)。zynd9foi2#
最近,
set_trace_func
被弃用:注意:此方法已过时,请改用TracePoint。
我们可以使用TracePoint,它支持
set_trace_func
:这实际上比
set_trace_func
更强大,因为您可以在方便的时候启用和禁用它。:line, :class, :end, :call, :return, :c_call, :c_return, :raise, :b_call, :b_return, :thread_begin, :thread_end
下面是一个完整的例子:
aor9mmx13#
我想包括事件发生的时间以及在每个函数中花费的时间
我试图调试为什么创建用户和登录ActiveAdmin要花这么长时间。
从那我知道Ruby花了不止一分钟在
__bc_crypt
上。