Node.js 堆栈跟踪不包括用户代码
Node.js stacktraces don't include user code
调试 Node.js 代码时,我经常遇到调用堆栈不包含我的程序代码,只包含 node_modules/non-user 代码,尽管当前执行行位于我代码中的某个位置。这违背了通过我的应用程序代码跟踪调用堆栈来查看执行路径的目的。
为什么我的源文件没有显示在调用堆栈中?
看来您正在查看一个异步堆栈跟踪,其中除了您的回调之外您的代码不在堆栈中,因为您的代码 unwound/finished 然后调用了异步回调。
所有承诺的所有 .then()
处理程序都使用干净的堆栈异步调用。这是根据承诺规范。因此,promises 总是让当前的执行线程完成并展开,然后在调用回调时触发 .then()
堆栈上没有用户代码的处理程序。您所描述的是同步代码的工作方式,而不是异步代码。如果您展示了实际代码并描述了您正在查看调用堆栈的位置,我们可以更具体地而不是理论上地讨论。
通常必须使用日志记录来跟踪异步进度,因为您不能轻松地单步执行它,也不能只是中断并查看堆栈跟踪。
看一个更简单的例子:
function foo() {
setTimeout(() => {
console.log("timer"); // set breakpoint here
}, 100);
}
foo();
函数 foo()
已完成执行并在回调被调用之前返回,因此堆栈跟踪上将没有您的任何代码(除了回调)。
虽然 .then()
处理程序使用与 setTimeout()
略有不同的调度程序,但原理是相同的。
调试 Node.js 代码时,我经常遇到调用堆栈不包含我的程序代码,只包含 node_modules/non-user 代码,尽管当前执行行位于我代码中的某个位置。这违背了通过我的应用程序代码跟踪调用堆栈来查看执行路径的目的。
为什么我的源文件没有显示在调用堆栈中?
看来您正在查看一个异步堆栈跟踪,其中除了您的回调之外您的代码不在堆栈中,因为您的代码 unwound/finished 然后调用了异步回调。
所有承诺的所有 .then()
处理程序都使用干净的堆栈异步调用。这是根据承诺规范。因此,promises 总是让当前的执行线程完成并展开,然后在调用回调时触发 .then()
堆栈上没有用户代码的处理程序。您所描述的是同步代码的工作方式,而不是异步代码。如果您展示了实际代码并描述了您正在查看调用堆栈的位置,我们可以更具体地而不是理论上地讨论。
通常必须使用日志记录来跟踪异步进度,因为您不能轻松地单步执行它,也不能只是中断并查看堆栈跟踪。
看一个更简单的例子:
function foo() {
setTimeout(() => {
console.log("timer"); // set breakpoint here
}, 100);
}
foo();
函数 foo()
已完成执行并在回调被调用之前返回,因此堆栈跟踪上将没有您的任何代码(除了回调)。
虽然 .then()
处理程序使用与 setTimeout()
略有不同的调度程序,但原理是相同的。