2011-10-05 7 views
23

を「最大コールスタックサイズを超え」:私は次の出力で死ぬことを引き起こす可能性がありますサーバーを持っている

events.js:38 
EventEmitter.prototype.emit = function(type) { 
           ^
RangeError: Maximum call stack size exceeded 

しかし、スタックダンプまたは跡形もなく、私はこのかどうかを発見する方法がありません問題関数がどこにあるのかというと、無限回帰またはちょっと大きすぎる連鎖です。

ノードを実行して--traceオプションを指定すると、テストが遅くなるだけでなく、問題が再現されなくなりました。

誰でもこの底に到達するための解決策やヒントはありますか?

+0

これが付着し、起こることが知られていた前と後のこの特定の問題は、差分を比較することで解決しました新しい/変更されたすべての 'emit'呼び出しによる余分なロギングと' 'drain''イベントでの共同再帰につながるスコープエラーを発見します。 これを解決した可能性のある最も一般的な戦略に受け入れられた答えを私は引き続き表彰します。 – OrangeDog

答えて

9

答えが、現在されているようです。

This archived thread from the v8-dev mailing list

は、

  • デイブ・スミスは、クロムプロジェクトの
  • 楊過はそれを説明したパッチを、この非常に問題をもたらし、提案した議論を示し、問題に対するクロムのバグをファイル、および適用されます別の修正
  • DaveはNode(その時点で0.8)がV8 3.11を使用しており、パッチをバックポートすることについて尋ねています。ヤンはパッチがV8 3.15に上陸し、バックポートされないと答えている。

Node.js v0.8はV8 3.11を使用しました。 Node.js 0.10は現在V8 3.14を使用しています。したがって、この問題でChromiumが受け入れるパッチは、Nodeが関係する限り、まだ「未来」です。

(それは私がこのすべてを学んだ彼の答えからスレッドを以下でありますので、この答えは、@Coderoshiへの感謝を負う。)

+0

これに関するすべてのニュース?私は "RangeError:最大呼び出しスタックサイズを超えました"をデバッグするのと同じ問題を抱えています。問題は、数日から変更されていないWebアプリケーションで発生し、検索方法がわからないため、スタックトレースが大きな助けになることです。 –

+0

ノード0.11は、この状況でスタックトレースを表示するのに十分な新しいバージョンのV8を使用しています。ノード0.11でwebappを実行できるのであれば、それを試してみてください。 – metamatt

+1

私はwebappを実行することができましたが、v.0.11.6を試しましたが、スタックトレースは機能しませんでした。とにかく、私はバグを修正しましたが、このコメントは、スタックトレースを検索する同様のバグを持つ人には便利だと思いました。おそらく、誰かの時間を節約し、不安定なバージョンをコンパイルするのではないでしょうか。 –

4

「少し大きすぎるチェーン」である可能性は低いようです。

おそらく、それ自体がトリガされたイベントを呼び出す関数です。

コードの速度が低下しているため、無限再帰が停止する場合。 私の推測では、待ち行列があり、遅いモードでは が速くいっぱいになっていないことでしょう。

これで問題が解決しない場合は、もっと情報が必要だと思います。 多分誰かがこれをキャッチオールしています。

2

このパッチは、解決策を見つけるのに役立ちます。それは途方もなくスタックトレースを拡張:タイトに座ると、Node.jsのは、新しいV8バージョンにアップデートするか、the patch from this Chromium project bug reportで独自に構築するのを待つ:

https://github.com/dizzyd/node/commit/40434019540ffc17e984ff0653500a3c5db87deb

+0

これは正しいアプローチのようです。私はこのパッチを「スタックトレースを大幅に拡張する」とは言及しません。スタックオーバーフロー例外のスタックトレースを作成するのがずっと難しくなっていると私は説明します。ところで、このパッチで修正されたコードには、TODO(1240995)への参照が含まれています。誰がどのバグデータベースを参照しているのか知っていますか? – metamatt

+0

私はバグ1240995を見つけられませんでしたが、私はdizzydのパッチとなったものを見つけました。 http://stackoverflow.com/a/15664576/275581を参照してください。 – metamatt

関連する問題