Ruby Debugger异常缓存问题求助(Ruby1.9.3/Rails3.2)
解决Ruby 1.9.3 + Rails 3.2中debugger gem的源码缓存问题
这是旧版debugger gem(适配Ruby 1.9.x的系列版本)在Rails开发环境下常见的源码缓存不同步问题——Rails的代码重载机制会更新实际执行的逻辑,但调试器自身缓存了首次加载的文件内容,导致断点视图显示旧代码,可实际运行的是修改后的新代码(所以eval a能得到正确结果)。
给你几个实用的解决办法:
1. 调试会话中手动刷新缓存
在调试提示符下执行reload命令,强制调试器重新读取当前文件的最新内容:
(rdb:4) reload
执行后再查看断点附近的代码,就能看到修改后的a = "hello2"了。
2. 配置调试器自动重载源码
在项目中新建或修改config/initializers/debugger.rb,添加以下配置:
# 开启调试器自动检测文件变化并重新加载源码 Debugger.settings[:auto_reload] = true
这样后续修改代码后,调试器会自动同步最新的源码视图,不用每次手动执行reload。注意这个配置在debugger gem 1.6.x及以上版本(适配Ruby 1.9.3的主流版本)是支持的。
3. 临时查看最新源码
如果不想刷新全局缓存,也可以用list命令指定行号范围,强制读取文件的最新内容:
(rdb:4) list 4-10
这个命令会直接从磁盘读取文件的指定行,输出的就是修改后的最新代码。
补充说明
Rails开发环境的代码重载是通过ActiveSupport::Reloader实现的,它只负责重新加载类的定义逻辑;而旧版debugger gem的源码视图模块有自己的文件缓存,和Rails的重载机制没有联动,这就是为什么会出现"执行逻辑更新了,但视图显示旧代码"的矛盾现象。
内容的提问来源于stack exchange,提问作者HK15
相关产品推荐
相关产品推荐

