Rails7使用debug gem调试时rdbg提示符不显示、命令无响应
Rails 7 内置debug gem交互异常排查方案
问题表现
在Ruby 3.1.2 + Rails 7.0.2环境中使用官方默认内置的debug gem开展调试,在Controller代码中添加debugger语句后可以成功触发调试会话,但终端始终不显示(rdbg)交互提示符,输入n等单步调试命令无响应,偶发命令生效也存在数分钟级延迟,完全无法满足调试需求。
现有环境Gemfile配置
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '3.1.2' gem 'rails', '~> 7.0.2', '>= 7.0.2.4' gem 'sprockets-rails' gem 'pg' gem 'puma' gem 'importmap-rails' gem 'turbo-rails' gem 'stimulus-rails' gem 'tailwindcss-rails' gem 'jbuilder' gem 'redis' gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] gem 'bootsnap', require: false gem 'sorcery' gem 'rails-i18n' gem 'config' gem 'simple_form' gem 'enum' gem 'enum_help' gem 'draper' gem 'redis-actionpack' gem 'carrierwave' gem 'validates_email_format_of' group :development, :test do gem 'annotate' gem 'capybara' gem 'debug', platforms: %i[mri mingw x64_mingw] gem 'factory_bot_rails' gem 'faker' gem 'launchy' gem 'rails-controller-testing' gem 'rspec-rails' gem 'shoulda-matchers' gem 'webdrivers' end group :development do gem 'web-console' gem 'better_errors' gem 'binding_of_caller' gem 'solargraph' gem 'letter_opener_web' end
异常触发时终端状态

排查解决步骤
按优先级从高到低依次操作,每步完成后重启Rails服务触发debugger验证是否恢复:
- 调整Puma开发环境配置,禁用多线程/多进程
Puma在开发环境默认启用多线程,rdbg附加到多线程进程时会出现IO抢占阻塞,是该问题最高频诱因。修改config/puma.rb,针对开发环境强制单线程单进程运行:# 添加到puma.rb配置末尾 if ENV.fetch("RAILS_ENV") == "development" threads 1, 1 workers 0 end - 排除调试类Gem的TracePoint钩子冲突
开发环境同时安装的better_errors、binding_of_caller、web-console三个Gem会和debug gem抢占Ruby TracePoint钩子,导致rdbg交互通道阻塞。先临时注释这三个Gem的引用:
执行group :development do # gem 'web-console' # gem 'better_errors' # gem 'binding_of_caller' gem 'solargraph' gem 'letter_opener_web' endbundle install后重启服务测试,如果rdbg恢复正常,后续使用rdbg调试时临时禁用这三个Gem即可,无需永久卸载。 - 升级debug gem修复已知兼容性bug
Ruby 3.1.2默认绑定的debug 1.x版本存在TTY检测缺陷,在tmux、IDE内置终端、旧版Windows Terminal环境下会错误判定终端为非交互模式,导致提示符不渲染。直接升级debug到最新稳定版:
升级后如果仍存在交互异常,启动Rails服务时添加环境变量强制rdbg走本地终端IO,禁用远程调试端口:bundle update debugRUBY_DEBUG_NO_REMOTE=1 rails s - 清除Bootsnap缓存
Bootsnap的方法预编译缓存可能会干扰debug gem的TracePoint初始化流程,执行以下命令清除缓存后重启服务:rm -rf tmp/cache/bootsnap-* - 重置终端输入模式
触发debugger后如果终端进入无回显状态,直接按一次Ctrl+C即可重置终端输入模式,多数场景下会直接调出(rdbg)提示符。
内容的提问来源于stack exchange,提问作者mojaomi
相关产品推荐
相关产品推荐

