在ruby:3.0.2 Docker镜像中运行./bin/rails出现异常调试报错
触发原因
自动进入调试会话的原因
- 运行环境中的
RUBYOPT环境变量被配置了-r debug参数,该参数会强制所有Ruby进程启动时预加载Ruby标准库内置的旧版调试模块debug.rb,执行./bin/rails未指定子命令打印完帮助信息后,就会自动触发调试器启动,出现(rdb:1)的调试提示符。 - Ruby 3.0.2版本自带的
debug.rb本身依赖已废弃的callcc能力,这也是报错中callcc is obsolete; use Fiber instead警告的来源。
退出时死锁报错的原因
- Ruby 3.0.x系列内置的
debug.rb存在未修复的退出逻辑bug:通过exit命令终止调试会话时,调试器内部的线程锁机制会重复尝试获取自身已经持有的锁,直接触发deadlock; recursive locking的ThreadError。
修复方案
- 执行
echo $RUBYOPT检查当前环境变量,确认存在-r debug参数后,执行unset RUBYOPT即可临时解决该问题,再次运行./bin/rails会恢复正常。 - 如果是Docker镜像内置了该环境变量配置,修改Dockerfile或容器启动配置,删除
RUBYOPT中-r debug相关参数即可永久解决。 - 若确实需要使用调试能力,不要使用Ruby 3.0内置的旧版debug模块,单独安装官方维护的新版
debuggem即可规避该类兼容性问题。
内容的提问来源于stack exchange,提问作者gingermusketeer
相关产品推荐
相关产品推荐

