Guard 导致“错误:无法修改字符串;暂时锁定”

Posted

技术标签:

【中文标题】Guard 导致“错误:无法修改字符串;暂时锁定”【英文标题】:Guard causing "Error: can't modify string; temporarily locked" 【发布时间】:2013-10-30 02:06:01 【问题描述】:

在使用guard-rspec 在Rails 4 项目中运行guard 时,我在vim 中打开/关闭文件时偶尔会看到以下错误。我试过升级/降级guard、guard-rspec、pry和其他库,但没有运气。

ruby 2.0.0p247(2013-06-27 修订版 41674)[x86_64-linux] 捆绑器版本 1.3.5 Guard 版本 2.1.1

以下是我每隔几次测试运行时看到的堆栈跟踪:

Error: can't modify string; temporarily locked
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:624:in `readline'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:624:in `block in readline'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:564:in `handle_read_errors'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:609:in `readline'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:384:in `retrieve_line'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:301:in `block in r'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:298:in `loop'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:298:in `r'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:276:in `re'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:254:in `rep'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:234:in `block (3 levels) in repl'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:232:in `loop'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:232:in `block (2 levels) in repl'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:231:in `catch'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:231:in `block in repl'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:230:in `catch'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_instance.rb:230:in `repl'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/pry-0.9.12.2/lib/pry/pry_class.rb:170:in `start'
/home/charles/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/guard-2.1.1/lib/guard/interactor.rb:133:in `block in start'
[1] Specs guard(main)>

【问题讨论】:

我正在经历同样的事情。我在 RVM (1.24.4) 上。和 ruby​​ 2.0.0p353(2013-11-22 修订版 43784)[x86_64-linux]。并撬开 0.9.14。和 Rails 3.2.14。还有 Ubuntu 13.10。 【参考方案1】:

将rb-readline gem 添加到我的 Gemfile 似乎可以解决问题。

gem "rb-readline", "~> 0.5.0"

我的猜测是 ruby​​ 2.0.0-p247 的 rbenv 编译版本存在 readline 问题,这解释了为什么会在 pry_instance.rb:624:in 'readline' 中出现错误。 rb-readline 项目是 readline 库的纯 ruby​​ 实现,似乎可以缓解这个问题。

可能有更好的解决方案涉及重新编译 ruby​​,但我还没有找到。

【讨论】:

不了解你,但使用 rb-readline 完全搞砸了我的 pry 环境(即在运行规范时执行 binding.pry),所以这是不行的。 @PawełGościcki 我也是。我注意到使用 rb-readline 还有其他副作用。例如 home 键和 end 键没有按预期工作。【参考方案2】:

这似乎确实是 Ruby 2.0.0 和 1.9.3 中的错误。见https://bugs.ruby-lang.org/issues/8669

它在修订版 42216 中向后移植到 Ruby 2.0.0。

【讨论】:

我不确定是不是这样。我正在使用 Ruby 2.0.0p353(2013-11-22 修订版 43784),我仍然体验它。 2.1.0p0 有同样的问题 是的,我在 2.1.0p0 上也看到了这一点。 有人在 2.1.0p0 上通过这个吗?【参考方案3】:

你在使用 Sublime Text 3 吗?如果是,你绝对应该check this out!

TLDR:设置"atomic_save": false

【讨论】:

以上是关于Guard 导致“错误:无法修改字符串;暂时锁定”的主要内容,如果未能解决你的问题,请参考以下文章

std::unique_lock与std::lock_guard分析

windows 10 关闭Hyper-V(或者Credential Guard or Device Guard)以运行vmware

基于std::mutex std::lock_guard std::condition_variable 和std::async实现的简单同步队列

win10系统VMware Workstation与Device/Credential Guard不兼容

解决:VMware Workstation 与 Device/Credential Guard 不兼容

win10家庭版VMware,禁用Device/Credential Guard不兼容问题