hack のためのネタ帳, etc,,,

bundler を入れてみたんだが、以下のように stack があふれて正常に動かなかった。
$ bundle update
The source :rubygems is deprecated because HTTP requests are insecure.
Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not.
Fetching gem metadata from http://rubygems.org/.........
Fetching additional metadata from http://rubygems.org/..
Resolving dependencies...Unfortunately, a fatal error has occurred. Please see the Bundler
troubleshooting documentation at http://bit.ly/bundler-issues. Thanks!
/home/kou/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/bundler-1.5.3/lib/bundler/friendly_errors.rb:40: stack level too deep (SystemStackError)
ググってみたら、cygwin は stack を調整しないと足らないんだそうで、
peflags コマンドに -X オプションを与えて stack commit size を変更する必要があるとの事。
まず初期状態の確認。
$ peflags -v -x -X ~/.rbenv/versions/*/bin/ruby
/home/kou/.rbenv/versions/2.0.0-p353/bin/ruby: coff(0x0027[+relocs_stripped,+executable_image,+line_nums_stripped,+bigaddr]) pe(0x8000[+tsaware])
                                               stack reserve size      : 2097152 (0x200000) bytes
                                               stack commit size       : 4096 (0x1000) bytes
reserve size が 2MiB で commit size が 4KiB のようだ。
次に割り当ての変更
$ peflags -v -x$[ 2*1024**2 ] -X$[ 128*1024 ] ~/.rbenv/versions/*/bin/ruby
/home/kou/.rbenv/versions/2.0.0-p353/bin/ruby: coff(0x0027[+relocs_stripped,+executable_image,+line_nums_stripped,+bigaddr]) pe(0x8000[+tsaware])
                                               stack reserve size      : 2097152 (0x200000) bytes
                                               stack commit size       : 131072 (0x20000) bytes
上記のように reserve size は 2MiB のままで commit size を 128KiB にしてみたところ bundler は正常に動いた。
注意点としては -x, -X オプションの後にスペースを空けてはいけない模様。
参考:

関連

このページへのコメント

Cygwin64+Ruby2.1.1だと256*2048で動きました。

peflags -v -x$[ 2*1024**2 ] -X$[ 256*2048 ] ~/.rbenv/versions/*/bin/ruby

ありがとうございます。
助かりました。

0
Posted by ktykogm 2014年03月03日(月) 17:56:31 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です