4

私のスクリプトの1つで常にこのエラーが発生するようです:

/Users/amosng/.rvm/gems/ruby-1.9.3-p194/gems/ruby-prof-0.11.2/lib/ruby-prof/profile.rb:25: stack level too deep (SystemStackError)

以前にこのエラーに遭遇した人はいますか? 何が原因で、それを防ぐために何ができるでしょうか?

コマンドを使用して ruby​​-prof スクリプトを実行します

ruby-prof --printer=graph --file=profile.txt scraper.rb -- "fall 2012"

編集私は Mac OS X を使用しています。残念ながら、やっulimit -s 64000てもあまり役に立たないようです。ulimit -aこれが与えるものです:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 64000
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

編集 2

Andrew Grimm のソリューションは ruby​​-prof のクラッシュを防ぐためにうまく機能しましたが、プロセスにかかる合計時間の 679.50% のようなパーセンテージが表示されるため、プロファイラー自体に問題があるようです...

4

3 に答える 3

6

回避策の1つは、末尾呼び出しの最適化をオンにすることです。

以下は、TCOがオンの場合は機能するが、TCOがオフの場合は機能しない例です。

RubyVM::InstructionSequence.compile_option = {
  :tailcall_optimization => true,
  :trace_instruction => false
}

def countUpTo(current, final)
  puts current
  return nil if current == final
  countUpTo(current+1, final)
end

countUpTo(1, 10_000)
于 2012-07-31T23:23:51.447 に答える
3

スタックレベルが深すぎると、通常、無限ループを意味します。エラーが発生するruby-profコードを見ると、それが呼び出しスタックの再帰を検出するメソッドであることがわかります。

再帰を使用しているコード(コード内で再帰を使用できる場所はいくつですか?)を調べて、ボトムアウトしない原因となる条件があるかどうかを確認してください。

また、システムスタックが、実行しようとしていることを処理するのに十分な大きさではないことを意味する場合もあります。たぶん、あなたは大きなデータセットを再帰的に処理していますか?スタックサイズを確認できます(unixyシステム):

$ ulimit -a

スタックサイズを増やします

$ ulimit -s 16384

アルゴリズムの調整を検討することもできます。このスタックオーバーフローの質問を参照してください

既存の質問を再ハッシュするだけではないことを願っています...

于 2012-07-27T17:57:39.920 に答える
2

Ruby-prof でパーセンテージが 100% を超えることは既知のバグでしたが、今すぐ修正する必要があります。

于 2013-02-11T21:40:22.787 に答える