2014-09-30 39 views
1

我有一个奇怪的问题,我有一个模块在我的Rails应用程序启动过程中的某个时刻被神秘地定义,我无法弄清楚在哪里。该模块的名称是CauseRails引导过程中模块的跟踪定义

我已经试过:

  • grepping为class Causemodule Cause项目目录没有结果
  • pry版在config/application.rb每一步,并与Object.const_get('Cause')检查......在所有该文件是的undefined(返回一个NameError: uninitialized constant Cause-这很好)
  • pry ed在我的第一个初始化程序,它在那里定义。
  • 使用pry-byebug设置一个断点,我会希望将停止的那一刻Cause执行中被定义,但它并没有像下面的表达式:break if (Object.const_get('Cause') rescue false)

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

希望对此有帮助。

+0

它可能来自您已安装的其中一个宝石。你能向我们展示你在Gemfile中的宝石列表吗? – infused 2014-09-30 20:22:10

+0

@infused已添加到帖子。 – neezer 2014-09-30 20:32:21

回答

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来获取堆栈跟踪。

+0

太棒了,谢谢! – neezer 2014-10-08 15:20:27

0

好吧,我想出了它使用的是什么git bisect,并在我的代码库中追溯了几个月......事实证明,违规者是gem 'cells'。现在,在单元代码库中进行深入研究,找出错误并发布一个PR来修复它...

不过,如果有一种方法可以在定义模块时暂停执行,为我节省了大量的一分之二的时间。