2017-09-03 5 views
1

Node.jsコードをデバッグするとき、自分のプログラムのコードが含まれていないコールスタックが発生することがよくあります。現在実行中の行にもかかわらずnode_modules /私のコード内の場所。これは、コールスタックをフォローしてアプリケーションコードを通じて実行パスを確認するという目的を破ります。Node.jsスタックトレースにユーザコードが含まれていない

ソースファイルがコールスタックに表示されないのはなぜですか?

Full stacktrace

+0

あなたのコードが巻き戻されていない/終了した後に非同期コールバックが呼び出されたため、あなたのコードがスタックにない非同期のスタックトレースを見ていると思います。 – jfriend00

+0

これが実際に問題であることを確認できる方法はありますか?私は約束を使用しており、それを親の約束どおりに返すので、元のソースコードからブレークポイントまでの途切れのないコールトレースが存在することが予想されます。 – sabrehagen

+0

すべての約束事のすべての '.then()'ハンドラは、クリーンスタックと非同期に呼ばれます。それは約束の仕様です。したがって、常に現在の実行スレッドが終了して解放されることを約束し、コールバックが呼び出されたときにスタック上にユーザコードを持たない '.then()'ハンドラを起動します。あなたが記述しているのは、同期コードが非同期コードではなく動作する方法です。あなたが実際のコードを示し、コールスタックをどこで見ているのかを記述すれば、理論的にではなくより具体的に話すことができます。 – jfriend00

答えて

3

あなたのコードは、/完成巻き戻された後、非同期コールバックが呼ばれたので、あなたのコードは、コールバックを除き、スタックにない非同期スタックトレースを見ていることが表示されます。

すべて.then()すべての約束事のハンドラはクリーンスタックと非同期に呼ばれます。それは約束の仕様です。したがって、コールバックが呼び出されたときにスタック上にユーザコードを持たないハンドラを実行して、.then()ハンドラを起動すると、現在の実行スレッドが終了して解放されることを約束します。あなたが記述しているのは、同期コードが非同期コードではなく動作する方法です。あなたが実際のコードを示し、コールスタックをどこで見ているのかを記述すれば、理論的にではなくより具体的に話すことができます。

非同期の進捗状況は、簡単に突き抜けることができず、スタックトレースを破棄して調べることができないため、ロギングで追跡する必要があります。見て少しシンプルな例として

function foo() { 
    setTimeout(() => { 
     console.log("timer"); // set breakpoint here 
    }, 100); 
} 

foo(); 

機能foo()は実行を終了し、コールバックが呼び出される前に返されたため、スタックトレースはちょうどよりあなたのコードのいずれかが(他の必要はありませんしましたコールバック)。

.then()ハンドラはsetTimeout()とは若干異なるスケジューラを使用しますが、原則は同じです。

関連する問題