1

これを報告するのは、以前は機能していたが、リリースされたばかりのRuby 2.0.0-p0.

テンプレートがDOMのタグに.erb埋め込む文字列を生成するSinatraアプリケーションがあります。data-前述のとおり、Ruby 2.0 にアップグレードするまでは問題なく動作していました。を使用2.0.0-p0すると、通常、プログラムを 5 ~ 20 回実行した後に、セグメンテーション違反エラーが発生します。Ruby 1.9 に戻すと、再び完全に動作し、プログラムを何百回も問題なく実行できます。

これらのエラーから得られる結果の例を次に示します。これは、エラー リストの「制御フレーム情報」セクションの最初の数行です。

-- Control frame information -----------------------------------------------
c:0061 p:0028 s:0315 e:000303 METHOD terrain_001.rb:509
c:0060 p:0012 s:0298 e:000296 BLOCK  terrain_001.rb:494 [FINISH]
c:0059 p:---- s:0294 e:000293 CFUNC  :each
c:0058 p:0008 s:0291 e:000290 BLOCK  terrain_001.rb:493 [FINISH]
c:0057 p:---- s:0288 e:000287 CFUNC  :each
c:0056 p:0023 s:0285 e:000284 METHOD terrain_001.rb:492
c:0055 p:0068 s:0281 e:000279 BLOCK  /home/john/Desktop/stra-dams/views/index.erb:3 [FINISH]

エラーが発生した場所として示されている行番号は、常に次のコード内にあり、メソッド内の行によってメソッドが呼び出された後のハッシュの定義内のどこかにありvalues{}ます。encodestr << encode(hex)terrain_string

def terrain_string
  str = ""
  @terrain = build_terrain
  @terrain.each do |t|
    t.each do |hex|
      str << encode(hex)
    end
  end
  str
end


# encode elevation values to a one-character code
def encode(elev)
  values = {
    :elev_10 => "a",
    :elev_20 => "b",
    :elev_30 => "c",
    :elev_40 => "d",
    :elev_50 => "e",
    :elev_60 => "f",
    :elev_70 => "g",
    :elev_80 => "h",

おそらく、他の人がまったく新しい Ruby 2.0 リリースを試した後、他の人が同様のエラーを報告するでしょう。2.0.0-p0それまでの間、リリースの問題を特定するのに役立つ可能性がある、他に確認すべきことはありますか?

4

1 に答える 1

2

Ruby 2.0.0 で新しいオープンソース フレームワークを使用すると、非常によく似た結果が得られます。Ruby 2.0.0-p0 に問題があり、これらのセグメンテーション違反が発生するか、一般的な gem との互換性の問題があるようです。ランダムな性質のため、どのライブラリが原因であるかを特定することは非常に困難です。

Phusion Passenger のスマート スポーン メソッドなど、Web アプリがマルチスレッド モードまたはフォーク モードで実行されている場合に、最もエラーが発生するようです。ruby 2.0.0 の次のパッチ レベルで修正されることを期待しています。

実際のセグメンテーション違反は、実行中のさまざまな時点で発生することに注意してください。ノコギリ内の場合もあれば、ERB、SASS、Tilt 内の場合もあります。基本的にはタイミングの問題です。私のアプリは小さいので、テンプレートのレンダリングと Nokogiri での応答の後処理に最も多くの時間を費やします。

于 2013-03-19T05:53:42.273 に答える