在Rails启动期间跟踪模块的定义

时间:2014-09-30 19:51:15

标签: ruby-on-rails ruby ruby-on-rails-3

我遇到一个奇怪的问题,我的Rails应用程序启动过程中有一个模块被神秘地定义,我无法弄清楚在哪里。模块的名称为Cause

我试过了:

  • 点击class Causemodule Cause的项目目录,但没有结果
  • pryconfig/application.rb的每一步都进行了检查,并使用Object.const_get('Cause')进行了检查...在整个文件中都未定义(返回NameError: uninitialized constant Cause - 这很好)
  • pry在我的第一个初始化程序中编辑, 在那里定义。
  • 使用pry-byebug设置一个断点,我希望在定义Cause时暂停执行,但它不喜欢以下表达式:break if (Object.const_get('Cause') rescue false)

任何人都有任何我没试过的调试策略?如果Rails在定义的那一刻暂停在一个pry会话中会很棒,但我无法弄清楚如何实现这一点。此外,在启动过程中评估config/application.rbconfig/initializers/*之间的内容是什么?关于这个主题的The Rails Guide似乎没有提到config/initializers目录......

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

好的,我弄清楚它使用git bisect是什么,并且在我的代码库中追溯了几个月......结果证明罪犯是gem 'cells'。现在在单元格代码库中进行识别以识别错误并发布PR来修复它...

但是,当定义一个模块时,有一些方法可以暂停执行,这将是很好的......这样可以节省大量二等分的时间。

答案 1 :(得分: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来获取堆栈跟踪