断点不生效主因是ruby-lsp与launch.json的type字段未对齐或Ruby版本与debug gem不兼容:Ruby≥3.1原生支持debug但Rails需显式引入,3.0需bundle add debug,≤2.7应升级或换IDE;type必须严格匹配插件——castwide.ruby-lsp对应"ruby_lsp",rebornix.ruby对应"Ruby";Rails调试须用"${workspaceFolder}/bin/rails"并禁用bootsnap和多线程。

断点不生效,90% 是 ruby-lsp 和 launch.json 的 type 字段没对齐,或 Ruby 版本与 debug gem 不兼容。
确认 Ruby 版本和 debug gem 是否就绪
Ruby 3.1+ 原生支持 debug,但 Rails 项目仍需显式引入;Ruby 3.0 需手动 bundle add debug;2.7 及更早版本直接放弃——rdbg 启动会报 undefined method `set_trace_func'。
- 运行
ruby -v确认版本,低于 3.0 就别折腾 VSCode 断点,换 RubyMine 或升级 Ruby - 在项目根目录执行
bundle add debug --group=development,test,检查Gemfile.lock中是否含debug (>= 1.8.0)(旧版 1.5.x 在 Rails 7.1+ 下大概率跳过断点) - 不要用
gem install debug全局安装——Rails 项目必须走 bundle,否则rdbg找不到调试器入口
launch.json 的 type 必须严格匹配所用插件
VSCode 里有两个互不兼容的 Ruby 调试后端:castwide.ruby-lsp(推荐)和已停更的 rebornix.ruby。混用会导致断点灰色、undefined method `write' for nil:NilClass 或调试器秒退。
- 装了
castwide.ruby-lsp插件 →"type": "ruby_lsp",且删掉所有pathToRDebugIDE、rdebug-ide相关字段 - 若坚持用老插件
rebornix.ruby→"type": "Ruby",但它不支持 Ruby 3.1+,启动即崩溃 - Rails server 调试时,
"program"必须写成"${workspaceFolder}/bin/rails",不能写"rails"——后者绕过 bundle,加载不到debug - 调试单个脚本,用
"program": "ruby ${file}",而非"${file}",避免 shebang 解析失败或权限问题
断点失效的典型场景与绕过方案
不是插件没装好,而是 Rails 的加载机制和并发模型天然干扰调试器捕获时机。
- Rails 7 默认启用
bootsnap,缓存 require 路径,导致改完代码后断点停在旧行号——临时注释config/boot.rb中的require "bootsnap/setup" - 开发环境默认开启多线程(
config.allow_concurrency = true),但rdbg当前不支持跨线程断点同步——在config/environments/development.rb加config.allow_concurrency = false - 控制器里打的断点总不触发?直接在 action 第一行写
binding.break,保存后刷新页面,VSCode 会自动接管并跳转,比 UI 断点可靠得多 - 子目录打开工作区(如只开
app/controllers)会导致ruby-lsp找不到Gemfile——务必从项目根目录启动 VSCode:code .
最易被忽略的是 VSCode 终端环境:系统终端里 which ruby 正确,但集成终端(Ctrl + `)输出 /usr/bin/ruby,说明 VSCode 启动时根本没加载你的 ~/.zshrc 或 ~/.bash_profile。所有后续配置都建立在错误 Ruby 环境上,必须先解决这个底层依赖问题。


















