Node.js stacktraces不包含用户代码

时间:2017-09-03 02:17:21

标签: javascript node.js debugging v8

在调试Node.js代码时,我经常会遇到不包含程序代码的调用堆栈,只有node_modules /非用户代码,尽管当前的执行行是在我的代码中的某个位置。这违背了跟随调用堆栈通过我的应用程序代码查看执行路径的目的。

为什么我的源文件没有显示在调用堆栈中?

Full stacktrace

1 个答案:

答案 0 :(得分:3)

看起来你正在查看异步堆栈跟踪,其中你的代码不在堆栈中,除了你的回调,因为你的代码解开/完成,然后调用了异步回调。

所有promises的所有.then()处理程序都与一个干净的堆栈异步调用。这是承诺规范。因此,promises总是让当前的执行线程完成并展开,然后在调用回调时,它们会在堆栈上没有用户代码的情况下触发.then()个处理程序。您所描述的是同步代码如何工作,而不是异步代码。如果您展示实际代码并描述您在调用堆栈的位置,我们可以更具体地讨论,而不是理论上。

异步进度通常必须通过日志记录进行跟踪,因为您无法轻松单步执行它,您也不能只是打破并查看堆栈跟踪。

作为一个更简单的例子来看:

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

foo();

函数foo()已经完成执行并在调用回调之前返回,因此堆栈跟踪将不会包含任何代码(除了回调之外)。

虽然.then()处理程序使用的调度程序与setTimeout()略有不同,但原理是相同的。