我遇到一个奇怪的问题,我的Rails应用程序启动过程中有一个模块被神秘地定义,我无法弄清楚在哪里。模块的名称为Cause
。
我试过了:
class Cause
或module Cause
的项目目录,但没有结果pry
在config/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.rb
和config/initializers/*
之间的内容是什么?关于这个主题的The Rails Guide似乎没有提到config/initializers
目录......
非常感谢任何帮助。
答案 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
来获取堆栈跟踪