gpt4 book ai didi

debugging - 如何找出 Ruby 中使用 at_exit 方法注册了哪些回调?

转载 作者:行者123 更新时间:2023-12-02 22:30:15 26 4
gpt4 key购买 nike

我有一个 Rails 3.2.8 项目,其中包含遗留测试/单元(最小测试)测试和 RSpec。尽管我们让 Jenkins 运行持续集成,但我们已经有一段时间没有注意到故障了。原因是,某些东西似乎会覆盖测试失败时的退出代码,并返回退出代码 0,无论是否存在失败的测试或规范。

我已经做了一些挖掘,但想深入 Kernel#at_exit 堆栈以查看哪些 gem/插件正在注册过程。我知道这是用 C 实现的语言功能。

所以,我正在寻求帮助,为这头牦牛剃毛:

  • 为什么我的失败测试返回退出代码 0?
  • 假设正在向 at_exit 添加 proc/callback,我如何进入查看回调是什么?
    • 我知道它是用 C 编写的,并且已经查看了源代码。我没有看到任何 ruby 钩子(Hook)。是否有可以添加的第 3 方扩展,或者是否有人知道 ruby​​ 补丁可以在其中提供一些可见性?
    • dtrace 可以进入那里查看吗?

我做过的一些事情:

  • 我已对 gem 和已安装的库进行了 grep 查找 at_exit,但没有发现任何可疑的内容。
  • 在我的 Rails 应用中使用相同的 gemset,如果我创建一个具有单一规范的新应用并运行它,它将按预期工作(通过测试返回退出代码 0,失败返回 1)
  • 希望找到 ruby​​ 的补丁/扩展来帮助提供 at_exit 的可见性

有些事情我还没有做:

  • 尝试学习 DTrace(我使用的是 Mac) - 我看过演示如何使用它的演示,但我还没有尝试过。
  • 从我的项目中删除所有 gem,看看可能是什么原因造成的 - 它似乎确实是特定于项目的。

提前感谢您的帮助!

P.S.:以下是该项目 Gemfile 中的 gem:

gem 'rails', '~> 3.2.8'
gem 'acts-as-taggable-on', '~> 2.3.1'
gem "akamai_api", :path => "vendor/git/akamai_api"
gem 'dalli'
gem "gabba"
gem "googlecharts", :require => "gchart"
gem "hpricot"
gem 'jquery-rails'
gem 'linkscape'
gem "logging", "1.4.3"
gem 'machinist', '>= 2.0.0.beta2'
gem "mysql2"
gem 'newrelic_rpm'
gem "premailer-rails3"
gem 'rack-cache'
gem "rack-ssl-enforcer"
gem 'sendgrid'
gem "tokyocabinet", "1.29"
gem 'twitter-bootstrap-rails', :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git'
gem "useragent"
gem "yajl-ruby", :require => "yajl"

group :assets do
gem 'coffee-rails'
gem 'sass-rails'
gem 'uglifier'
end

group :no_rake do
gem "vanity"
end

group :development, :test do
gem 'debugger'
gem 'thin'
gem 'rspec-rails'
end

group :test do
gem 'vanity'
gem 'minitest-rails'
gem 'mocha'
end

作为更新,我在 Gemfile 中进行了二叉树搜索(关闭一半,运行测试,关闭另一半......重复),直到测试正确失败。日志记录 gem 导致 rspec 返回非零,而 googlecharts gem 搞乱了测试/单元。此时,我不知道为什么。

我还没有进一步深入了解库(或我的应用程序中的依赖代码)的哪些行为正在影响测试。使用 Kernel#at_exit 快速 grep 没有返回任何内容,并且快速浏览每个源代码也没有发现任何内容。我会继续挖掘,但这就是我到目前为止所发现的。

我还没有提交错误报告,因为我还不知道问题是什么。

最佳答案

你一定喜欢 ruby :)

alias original_at_exit at_exit
def at_exit(*args, &block)
puts "registered at exit: #{caller * "\n"}"
original_at_exit *args, &block
end

关于debugging - 如何找出 Ruby 中使用 at_exit 方法注册了哪些回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com