2017-09-03 84 views
1

調試Node.js代碼時,我經常遇到不包含我的程序代碼的調用堆棧,只有node_modules /非用戶代碼,儘管當前執行的行是在我的代碼中的位置。這違背了調用堆棧的目的,通過我的應用程序代碼查看執行路徑。Node.js堆棧跟蹤不包括用戶代碼

爲什麼我的源文件沒有顯示在調用堆棧中?

Full stacktrace

+0

我可能會猜測您正在查看異步堆棧跟蹤,其中您的代碼不在堆棧中,除了您的回調,因爲您的代碼展開/完成,然後異步回調被調用。 – jfriend00

+0

有沒有一種方法可以證實這是事實上的問題?我使用Promise並將每個返回給它的父承諾,所以我期望從源代碼到斷點有一個完整的調用追蹤。 – sabrehagen

+0

所有承諾的'.then()'處理程序都是用一個乾淨的堆棧異步調用的。這是根據承諾規範。所以,promises總是讓當前的執行線程完成並展開,然後在調用回調時,它們在堆棧中激發'.then()'沒有用戶代碼的處理程序。你所描述的是同步代碼如何工作,而不是異步代碼。如果你展示了實際的代碼並且描述了你在查看調用堆棧的位置,我們可以更具體地談論而不是理論上的。 – jfriend00

回答

3

看來,你在尋找一個異步堆棧跟蹤您的代碼是不是在堆棧中,除了你的回調,因爲你的代碼解開/完成,然後異步回調被調用。

全部.then()所有承諾的處理程序都與一個乾淨的堆棧異步調用。這是根據承諾規範。所以,promises總是讓當前的執行線程完成並展開,然後在調用回調時,它們在堆棧上激發沒有用戶代碼的處理程序。你所描述的是同步代碼如何工作,而不是異步代碼。如果你展示了實際的代碼並且描述了你在查看調用堆棧的位置,我們可以更具體地談論而不是理論上的。

異步進度通常需要使用日誌記錄進行跟蹤,因爲您無法輕鬆地單步執行異步進程,而且您也不能輕易破解並查看堆棧跟蹤。

作爲一個小簡單的例子來看看:

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

foo(); 

功能foo()執行完畢並返回調用回調函數,因此堆棧跟蹤不會有任何代碼的(其他不僅僅是前回調)就可以了。

雖然.then()處理程序使用與setTimeout()略有不同的調度程序,但原理相同。