gpt4 book ai didi

ruby - 为什么即使堆栈级别不太深,Ruby 2.5.0 也会在 Alpine Linux 中引发 SystemStackError?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:43 25 4
gpt4 key购买 nike

这是重现问题的示例代码。

# test.rb
n = 100000
res = {}
1.upto(n).to_a.inject(res) do |r, i|
r[i] = {}
end

def f(x)
x.each_value { |v| f(v) }
end

f(res)

使用 Docker Hub 提供的 Docker 镜像运行此代码。

  • Alpine Linux 中的 Ruby 2.5.0 UNEXPECTED(不太深)
  • Alpine Linux 中的 Ruby 2.4.3 预期
  • Debian 中的 RUby 2.5.0 预期

有什么不同?

补充说明

(对不起,我的英文不好。)

这是补充说明。

我知道示例代码会导致 SystemStackError。我编写了导致 SystemStackError 的示例代码。

我想知道“水平”差异的原因。

  • Alpine Linux 中的 Ruby 2.5.0 -> “... 137 个级别...”
  • ALpine Linux 中的 RUby 2.4.3 -> “... 10067 级...”
  • Debian 中的 RUby 2.5.0 -> “... 9866 级...”

Ruby 2.5.0 + Alpine Linux (ruby:2.5.0-alpine3.7)

在本例中,堆栈级别为 137。

% docker container run -v (pwd):/mnt/my --rm -it ruby:2.5.0-alpine3.7 ruby -v /mnt/my/test.rb
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux-musl]
Traceback (most recent call last):
149: from /mnt/my/test.rb:11:in `<main>'
148: from /mnt/my/test.rb:8:in `f'
147: from /mnt/my/test.rb:8:in `each_value'
146: from /mnt/my/test.rb:8:in `block in f'
145: from /mnt/my/test.rb:8:in `f'
144: from /mnt/my/test.rb:8:in `each_value'
143: from /mnt/my/test.rb:8:in `block in f'
142: from /mnt/my/test.rb:8:in `f'
... 137 levels...
4: from /mnt/my/test.rb:8:in `f'
3: from /mnt/my/test.rb:8:in `each_value'
2: from /mnt/my/test.rb:8:in `block in f'
1: from /mnt/my/test.rb:8:in `f'
/mnt/my/test.rb:8:in `each_value': stack level too deep (SystemStackError)

但是简单的情况下,堆栈级别是 13092。

% docker container run --rm -it ruby:2.5.0-alpine3.7 ruby -v -e 'def f; f; end; f'
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux-musl]
Traceback (most recent call last):
13104: from -e:1:in `<main>'
13103: from -e:1:in `f'
13102: from -e:1:in `f'
13101: from -e:1:in `f'
13100: from -e:1:in `f'
13099: from -e:1:in `f'
13098: from -e:1:in `f'
13097: from -e:1:in `f'
... 13092 levels...
4: from -e:1:in `f'
3: from -e:1:in `f'
2: from -e:1:in `f'
1: from -e:1:in `f'
-e:1:in `f': stack level too deep (SystemStackError)

Ruby 2.4.3 + Alpine Linux (ruby:2.4.3-alpine3.7)

在这种情况下,堆栈级别为10067。与上述情况有很大区别。

% docker container run -v (pwd):/mnt/my --rm -it ruby:2.4.3-alpine3.7 ruby -v /mnt/my/test.rb
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux-musl]
/mnt/my/test.rb:8:in `each_value': stack level too deep (SystemStackError)
from /mnt/my/test.rb:8:in `f'
from /mnt/my/test.rb:8:in `block in f'
from /mnt/my/test.rb:8:in `each_value'
from /mnt/my/test.rb:8:in `f'
from /mnt/my/test.rb:8:in `block in f'
from /mnt/my/test.rb:8:in `each_value'
from /mnt/my/test.rb:8:in `f'
from /mnt/my/test.rb:8:in `block in f'
... 10067 levels...
from /mnt/my/test.rb:8:in `block in f'
from /mnt/my/test.rb:8:in `each_value'
from /mnt/my/test.rb:8:in `f'
from /mnt/my/test.rb:11:in `<main>'

我显示了 diff Dockerfile 的输出。

--- 2.4/alpine3.7/Dockerfile    2017-12-28 20:34:43.000000000 +0900
+++ 2.5/alpine3.7/Dockerfile 2017-12-28 20:34:43.000000000 +0900
@@ -7,9 +7,9 @@
echo 'update: --no-document'; \
} >> /usr/local/etc/gemrc

-ENV RUBY_MAJOR 2.4
-ENV RUBY_VERSION 2.4.3
-ENV RUBY_DOWNLOAD_SHA256 23677d40bf3b7621ba64593c978df40b1e026d8653c74a0599f0ead78ed92b51
+ENV RUBY_MAJOR 2.5
+ENV RUBY_VERSION 2.5.0
+ENV RUBY_DOWNLOAD_SHA256 1da0afed833a0dab94075221a615c14487b05d0c407f991c8080d576d985b49b
ENV RUBYGEMS_VERSION 2.7.4
ENV BUNDLER_VERSION 1.16.1

这意味着使用相同的 Alpine Linux。只是 ruby 不同。

Ruby 2.5.0 + Debian (ruby:2.5.0-stretch)

在本例中,堆栈级别为 9866。本例使用 Ruby 2.5.0,但它在 Debian(而非 Alpine)上运行。

% docker container run -v (pwd):/mnt/my --rm -it ruby:2.5.0-stretch ruby -v /mnt/my/test.rb
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
Traceback (most recent call last):
9878: from /mnt/my/test.rb:11:in `<main>'
9877: from /mnt/my/test.rb:8:in `f'
9876: from /mnt/my/test.rb:8:in `each_value'
9875: from /mnt/my/test.rb:8:in `block in f'
9874: from /mnt/my/test.rb:8:in `f'
9873: from /mnt/my/test.rb:8:in `each_value'
9872: from /mnt/my/test.rb:8:in `block in f'
9871: from /mnt/my/test.rb:8:in `f'
... 9866 levels...
4: from /mnt/my/test.rb:8:in `f'
3: from /mnt/my/test.rb:8:in `each_value'
2: from /mnt/my/test.rb:8:in `block in f'
1: from /mnt/my/test.rb:8:in `f'
/mnt/my/test.rb:8:in `each_value': stack level too deep (SystemStackError)

最佳答案

我们也在一些边缘案例中看到了这一点。我们已经确认操作系统和 Ruby 堆栈大小在所有情况下都是相同的。 (alpine 2.4.3,alpine 2.5.0,MacOS本地运行2.5.0)

到目前为止,我们能找到的唯一区别是 Alpine 2.5.0 图像是基于 Alpine 3.7 构建的,它使用 LibreSSL 构建 Ruby。 2.4.3 镜像是基于 Alpine 3.4 构建的,它仍在使用 OpenSSL。我们针对 OpenSSL 的本地 2.5.0 构建没有显示这种“短”堆栈长度。

关于ruby - 为什么即使堆栈级别不太深,Ruby 2.5.0 也会在 Alpine Linux 中引发 SystemStackError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48024419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com