javascript - Node.js 堆栈跟踪不包含用户代码

标签 javascript node.js debugging v8

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

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

Full stacktrace

最佳答案

您似乎正在查看异步堆栈跟踪,其中除了回调之外,您的代码不在堆栈中,因为您的代码已展开/完成,然后调用了异步回调。

全部.then()所有 Promise 的处理程序都使用干净的堆栈异步调用。这是根据 promise 规范。因此,promise 总是让当前执行线程完成并展开,然后它们触发 .then()调用回调时,堆栈上没有用户代码的处理程序。您所描述的是同步代码而不是异步代码的工作方式。如果您展示实际代码并描述您在哪里查看调用堆栈,我们可以更具体地讨论而不是理论上。

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

作为一个更简单的例子:

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

foo();

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

同时.then()处理程序使用与 setTimeout() 略有不同的调度程序,原理是一样的。

关于javascript - Node.js 堆栈跟踪不包含用户代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46019723/

相关文章:

java - Weblogic 安装程序从错误的文件中读取

javascript - 使元素可点击的 Angular Directive(指令)?

javascript - 如果在 Handlebars.js 中预编译自定义助手,如何注册自定义助手?

javascript - 字段动态添加到表单但不提交到服务器

javascript - 使用 Lodash 查找/过滤来自多个 parent 和多个 child 的数据

javascript - 如何将带有 html 文件的响应发送回 ejs 文件并在 ejs Node.js 上的 iframe 中显示

node.js - 使用 NodeJS 进行对称加密

javascript - 使用 aws sdk (nodejs) 在 AWS S3 中创建一个空文件夹

debugging - Grails 3 设置远程调试ip :port

javascript - Console.log() 不会输出到 C++ 中 Awesomium 的远程调试器