【问题标题】:how to debug to find the code that is blocking the main thread如何调试以找到阻塞主线程的代码
【发布时间】:2023-03-16 09:03:01
【问题描述】:

我有一个运行 6.1.1 版的 Rails 应用程序,目前我们使用 Ruby 2.7.2

在尝试升级到 Ruby 3 时,我遇到了一个有趣的问题:一些代码显然阻塞了主线程。当我尝试启动服务器或运行测试时,控制台卡住了,我什至无法停止进程,我必须kill它。

我找到了一个名为 valvat 的 gem,用于验证欧盟增值税号。我在其 Github 存储库上打开了一个问题,但维护者即使使用我拥有的相同 Gemfile.lock 也无法重现,这让我相信它可能不仅仅是 gem,必须是我代码中的其他内容。

这是我尝试启动服务器时发生的情况:

=> Booting Puma
=> Rails 6.1.1 application starting in development
=> Run `bin/rails server --help` for more startup options
^C^C^C

正如人们所看到的,我什至无法阻止它,线程现在挂了,我无法确切地知道是谁。

我尝试使用 -b -w 运行规范以查看我能看到的内容,但得到了相同的错误:线程挂起,我从 Ruby 收到的警告只是通用的,例如 method already defined 或类似的东西。

这是在线程挂起之前使用-b -w 运行规范时控制台的最后输出:

/Users/luiz/rails_dev/app/config/initializers/logging_rails.rb:18: warning: method redefined; discarding old tag_logger
/Users/luiz/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/activejob-6.1.1/lib/active_job/logging.rb:19: warning: previous definition of tag_logger was here

问题是,当我删除 gem 并运行此命令时,我也会收到这些警告,尽管那时规范运行没有问题。

有没有办法追踪到导致线程挂起的原因?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-6


    【解决方案1】:

    如果您没有错误消息,则很难了解您的应用程序究竟挂在哪里。

    由于开发人员无法使用您的 Gemfile.lock 进行复制,因此您的配置文件或初始化程序之一可能是罪魁祸首。您可以使用相同的 Gemfile 创建一个新的空白应用程序,逐个添加您的配置和初始化程序文件,并每次测试服务器是否运行,直到找到导致冻结的原因。

    还使用另一个 Ruby 版本测试您的应用程序(您使用的是 rbenv 还是 RVM?)

    同时检查您的系统日志,因为valvat 调用网络服务,您可能会在那里发现连接错误。查看此文档以了解如何访问您的系统日志:https://www.howtogeek.com/356942/how-to-view-the-system-log-on-a-mac/

    【讨论】:

    • 这些想法真的很好,这个链接肯定会对我有所帮助。我会继续努力,稍后再讨论这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2013-11-16
    • 2018-02-16
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多