4

私の app.js には次の内容があります。

var express = require('express')
  , http = require('http')
  , path = require('path')
  , redis = require('redis')
  , client = redis.createClient();

var app = express();

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.cookieParser('your secret here'));
    app.use(express.session());
    app.use(app.router);
    app.use(require('stylus').middleware(__dirname + '/public'));
    app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

require('./routes')(app);

client.on("connect", function () {
    console.log("Client on connect");
});


http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

私が試みているのは、node_redisライブラリを使用して Redis インスタンスに接続することだけです。Node.js と Redis の両方がローカルにインストールされます。私が指摘したいことの 1 つは、私が作成し、Jetbrains の Webstorm でこのプロジェクトを実行しようとしたことです (デバッグを提供する IDE が必要なので)。文字列「接続時のクライアント」がコンソールに記録されますが、私のアプリは毎回ほとんどクラッシュし'Process finished with exit code 139'ます. コマンドラインからアプリを実行してみましたが、アプリはクラッシュしません。最悪の部分は、アプリが Webstorm で実行に失敗したときにスタック トレースがまったくないことです。問題が何であるか、またはこのエラー コードに関してログに記録された詳細情報をどこで見つけることができるかについて、誰にも手掛かりがありますか?

また、同じページにいるように: 私の Redis サーバーは稼働しており、別のカスタム Web アプリケーションから一定のデータ ストリームを受信して​​います。redis-cli を起動して、Redis に実際にデータが含まれていることを確認できました。

4

1 に答える 1

3

Unix タイプの OS を使用している場合、139 は「128 + Node プロセスがクラッシュしたシグナル番号」を意味します。したがって、あなたの場合、そのシグナルは 11 で、ほとんどの Unices では SIGSEGV を意味します。つまり、Node プロセスは、ある種の無効なメモリ参照でクラッシュします。

私の経験では、IDE (または他のアプリ) からプロセスを開始しているときにこの種のエラーが発生した場合、通常は、IDE がクラッシュの原因となる何らかの環境を通過していることを意味します。実行中の Node プロセスに GDB をアタッチして (ただし、接続してクラッシュを引き起こす前に)、原因を突き止めることができます。

別の解決策: Webstorm が起動するノード実行可能ファイルを変更できる場合は、ノードをラップしてデバッグ情報を出力するシェル スクリプトを作成してみてください。このようなもの:

#!/bin/sh

echo "ENVIRONMENT: $ENV"
sleep 1
/path/to/actual/node "$@"

これにより、Node 実行可能ファイルに渡される環境変数が出力されます。そこから、疑わしいと思われる変数を試して設定を解除できます。

unset STRANGE_VARIABLE

Node 実行可能ファイルを開始する前に、上記のスクリプトにそれらを配置します。

于 2013-01-11T06:20:16.550 に答える