微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何调试找到阻塞主线程的代码

如何解决如何调试找到阻塞主线程的代码

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

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

我找到了一个名为 valvat 的宝石,用于验证欧盟增值税号。我在其 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 并运行此命令时,我也会收到这些警告,尽管当时规范运行没有问题。

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

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。