rabbit-shocker/rabbit

Segmentation fault on ruby 2.3.0preview2

Closed this issue · 12 comments

以下の手順で rabbit を起動し、起動後に次のスライドを表示されるために "j" をプレスすると Segmentation fault して、rabbit が終了してしまいます。
期待する動作は rabbit が終了せずに、次のページが表示されることです。

コマンド

$ rabbit-slide new --id sample --base-name sample --markup-language rd
$ cd sample
$ rabbit &> error.txt

エラーログ

https://gist.github.com/kunitoo/0f216aca4afd96bf18d8

タイトルだけでなくログも間違っていたので、ログも2.3.0preview2に更新しました。

kou commented

報告ありがとうございます。
Rabbitのインストール方法も教えてもらえますか?

gem install rabbit でインストールしました。
インストールした rabbit のバージョンは2.1.8です。

kou commented

ありがとうございます。
Rubyのインストール方法も教えてもらえますか?できればそのときのログも一緒にもらえると助かります。

(preview2用にちゃんとすべてのgemをリビルドしているかが気になっています。)

Ruby は rbenv でインストールしました ( rbenv install 2.3.0-preview2 )
以下がそのときのログですが、これでよろしいでしょうか?
https://gist.github.com/kunitoo/0f216aca4afd96bf18d8#file-ruby-build-20151211105213-2294-log

また、 rbenv-default-gems を使っているため、install 後に以下の gem のインストールが走ります。

  • bundler
  • tmuxinator
  • rails
kou commented

ありがとうございます。手元でも再現しました。

たぶん、これ、GCまわりのバグですね。。。Ruby-GNOME2由来のオブジェクトのマークが漏れている気がするんですけど。。。

kou commented

Ruby 2.3.0のバグな気がしました。

GC.start

def a
  lambda do
    yield
  end
end

def b(&block)
  a(&block)
end

def proc_sources
  sources = {}
  ObjectSpace.each_object(Proc) do |proc|
    sources[proc.object_id] = proc.source_location
  end
  sources
end

c = b {}

old_proc_sources = proc_sources
GC.start
new_proc_sources = proc_sources
require "pp"
pp((old_proc_sources.keys - new_proc_sources.keys).collect {|key| old_proc_sources[key]})
# => [["/tmp/a.rb", 21]]

のコードで、c = b {}で指定したブロック({})がGCされます。これはaが作ったブロックから参照されているのでGCされて欲しくないやつです。

kou commented

クラッシュするので報告しておきました。 https://bugs.ruby-lang.org/issues/11846

ありがとうございます。

kou commented

Ruby 2.3.0で動くようになっていたらcloseしてもらえますか?

Ruby 2.3.0 で動くようになったのを確認しました。ありがとうございます。

kou commented

確認ありがとうございます!