Ruby 一行代码让 ruby3.0 崩溃

tomanderson · 2021年02月09日 · 最后由 Ian 回复于 2021年02月09日 · 146 次阅读

昨天,我发现运行一段非常简单的代码会导致 ruby3.0 崩溃:

require 'digest/md5'
e = (1..1_000_000).to_a
arr = [e,e,e,e]

result = arr.map { |sub_arr|
  Ractor.new(sub_arr) do |sub_arr|
    sub_arr.map {
      Digest::MD5.hexdigest(rand.to_s)
    }
  end
}.map{|r| r.take}.reduce(:+)

神奇的是,把 e 的 range 改小之后(比如 1..100)就不崩溃了。当时我不敢确定是不是 ruby 的锅,因为有同学回复说,在他的环境下正常。

后来把这个问题发到https://bugs.ruby-lang.org/issues, 处理我问题的是 ko1(Koichi Sasada),他用一个更简化的版本复现了问题,只有一行代码:

2.times.map{ Ractor.new{ loop{ rand.to_s } } }.each(&:take)

看来基本可以确定是 ruby3.0 的 bug,大概率与 ractor 有关,可能与环境也有关。至于坑有多深我就不知道了,让大神去填吧。

各位如果方便的话,可以把这行代码放到 irb 里跑一下,只需 1 秒钟的时间。如果有人竟然不报错崩溃的,请回复我,我可以把情况发给 ko1 做个参考。

此话题已暂时被管理员屏蔽。

以下几种情况的帖子可能会被屏蔽:

  1. 标题/正文描述不清不楚;
  2. 无意义的发帖;
  3. 存在广告嫌疑;
  4. 招聘信息描述不清楚,未按照招聘节点的要求发帖,或职位信息不符合社区用户群需求;
  5. 新注册的帐号发布产品推广贴是不允许的哦,付出和回报是相等的,当然如果你的产品确实非常有意思,或是和 Ruby 有关的东西,是不会进入这个栏目的。
  6. 太过弱的提问会被直接转移到此节点,请在提问前多尝试,多搜索;
  7. 理论上,不允许发布 QQ 群、微信群之类讨论群。

如果你发现你的帖子被屏蔽,请自我检查反省,并修改帖子内容。


招聘贴被屏蔽原因

警告: 以后招聘贴不符合要求,直接屏蔽,管理员不再回复,如认真阅读,继续新发同样格式的贴,将会被禁用账号!

  • 排版请按 Ruby China 的 Markdown 格式要求,具体请认真阅读: 排版指导,并参考 这篇招聘 的排版;
  • 招聘内容过少,缺少公司介绍,产品介绍,职位介绍,或待遇,工作地,联系方式等必要信息;
  • 重复发帖(一家公司每月限制只能发一次招聘);
  • 专业不对口(个别不对口,但有特点的,我们会放过);

如果你有时间,请阅读 招聘栏目详细说明


学会如何合理提问,请阅读:https://ruby-china.org/topics/24325

当你修改好以后,可以回帖 @huacnlee@Rei@lgn21st 任何一人,我们将会审核,通过以后才可恢复到其他节点。

注!多次发现广告嫌疑的帐号,将会被禁用帐号。

报错 Incorrect checksum for freed object 0x7fa914d2c598: probably modified after being freed

windows 上的 irb 运行这行代码后直接退出了

我能理解你遇到 bug 的心情,可是我不能理解你一个 bug 要分两篇帖子来发的想法。

Rei 屏蔽了此话题: 重复发帖 02月10日 00:52
需要 登录 后方可回复, 如果你还没有账号请 注册新账号