6

現在、このクラッシュが発生していますが、ノード ファイバー インフラストラクチャに精通していないため、エラーの解釈やコードのインストルメント化をどこから開始すればよいかわかりません...

Meteor server running on: http://localhost:3000/
W202407-10:06:05.740(-8)? (STDERR) /Users/dauser/.meteor/tools/0b2f28e18b/lib/node_modules/fibers/future.js:173
W202407-10:06:07.363(-8)? (STDERR)                      throw(ex);
W202407-10:06:07.363(-8)? (STDERR)                            ^
W202407-10:06:07.363(-8)? (STDERR) RangeError: Maximum call stack size exceeded
=> Exited with code: 8
=> Meteor server restarted

私が理解しているように、何かが少し熱狂的に繰り返され、サーバー スタックが爆発し、クラッシュします。残念ながら、この問題のある関数がどこにあるかはわかりません.Deps.autorun呼び出し(現時点では1つだけ)を見ましたが、問題はないようです。私のコードは明示的な再帰を使用して実装されておらず、大きなオブジェクトが渡されていると疑う理由はありません。もちろん、私は本当に確信が持てません。

コードをインストルメント化して、どこが手に負えなくなっているかを示す方法についてのアドバイスを本当に探しています。Meteor は舞台裏で多くのことを行っているため、どこを見ればよいか、誰かが私にいくつかの指針を与えることができれば、非常に役に立ちます。

これに戻ってきたばかりですが、どこを見ればいいのかまだかなり迷っています。これは、ノード 0.11.x に更新すると詳細情報が得られることを示唆していますが、それを行っても、クラッシュしたときに詳細が追加されていないようです。

クラッシュは、ページのやり取りの後に発生します。つまり、サーバーが起動して正常に機能していますが、ブラウザーでリロードしたり、ページ自体を操作したりすると、BOOM!

一般的な要求により、サーバー コードは次のとおりです。

isAuthorized = () ->
    console.log "checking authorization"
    this.userId == Assets.getText('authorizedUsers')

Meteor.methods(
    isAuthorized : isAuthorized
    filePickerKey : () -> 
        # TODO: properly abstract this, rather than copy/paste...       
        if this.userId == Assets.getText('authorizedUsers')
            Assets.getText('fpKey')
        else
            Meteor.Error 403, 'Error 403: Forbidden')

future.js の 172 行目のコメントを外しても詳細はわかりませんでした:

I2041-15:52:07.363(-8)? Resolve cb threw Maximum call stack size exceeded

そして、node-inspector を使おうとしているときに遭遇した問題があります。私は過去30分間これをいじっていたので、根本的なエラーを起こしている可能性がありますが、npm経由でnode-inspectorをインストールしました(npm install -g node-inspector)。

それから、私は試します

$ node-inspector &
[1] 3408
$ Node Inspector v0.6.2
  info  - socket.io started
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.

$ meteor &
[2] 3413
$ [[[[[ ~/Projects/indefinite-ways ]]]]]

=> Meteor server running on: http://localhost:3000/

$ kill -s USR1 3413
Hit SIGUSR1 - starting debugger agent.
debugger listening on port 5858

ここまでは順調ですね。この時点で、クライアント側はブラウザで開かれていません (つまり、localhost:3000 を指すタブはありません)。localhost:5858 を指す Chrome タブを開くと、meteor.js のソースが表示されます。meteor.js の 6 行目にブレークポイントを設定します。

var Fiber = require('fibers');

その後、Meteor クライアント タブ (localhost:3000) を開くと、前述のスタック オーバーフローが再び表示されます。デバッガーは 6 行目で停止しません。または、他の方法で、デバッガーが気付いたことを示します。3 行目にブレークポイントを設定した場合も同様です。

4

3 に答える 3

4

node-inspectorを試してください。コールスタックを検査できます。これは使用方法のビデオ プレゼンテーションです。視覚的には chrome デバッガーのように見えます (同じベース ソースです)。

于 2013-12-11T00:17:13.650 に答える
2

もう少し役立つ回答は、非公式の Meteor FAQからのものです。

$ node-inspector &
$ NODE_OPTIONS='--debug-brk' mrt run &

これにより、バックグラウンドで node-inspector プロセスが開始され、適切なデバッグ フラグが設定された状態で meteor のノード コンテナーのリッスンが開始されます。Chrome タブを開いhttp://127.0.0.1:8080/debug?port=5858て手順を説明します。

また、厳密には質問への回答ではありませんが、上記のコードの問題のある行Meteor.Errorはサーバー コードで呼び出しているようです。私はまだそれを特定したであろうこれに対する答えを喜んで受け入れます. Meteor.Error はまったく EJSONable ではなく、解析しようとするとスタックが爆発するのではないかと推測しています。

于 2013-12-17T02:04:39.673 に答える