`
teddwen
  • 浏览: 614 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

Node.js中如何捕捉当前堆栈?

阅读更多

一、捕捉堆栈的时机

Node.js中捕捉堆栈只有在new Error()时会进行自动捕捉。初始化Error实例时调用Error.captureStackTrace(this),为实例捕捉堆栈并格式化成字符串塞进实例的stack属性中。

参考:http://nodejs.cn/api/errors.html#errors_error_capturestacktrace_targetobject_constructoropt

 

二、如何不通过new Error()捕捉当前调用堆栈?

const obj = Object.create(null); // 初始化一个空对象
Error.captureStackTrace(obj); // 捕捉堆栈并塞入obj.stack属性中
obj.stack; // 直接访问即可获取堆栈

 

 三、自定义堆栈格式

默认情况下v8内置了堆栈的格式化函数Error.prepareStackTrace(),和堆栈的层级捕捉限制Error.stackTraceLimit。我们如果想定制stack的内容,只要替换这两个v8内置的方法即可:

/**
 * Capture call site stack from v8.
 * https://v8.dev/docs/stack-trace-api
 */
function myPrepareStackTrace(obj, stack) {
  // do something stack format.
  // ...
  return stack;
}

// 替换内置stackTraceLimit、prepareStackTrace
const limit = Error.stackTraceLimit;
const prep = Error.prepareStackTrace;
Error.prepareStackTrace = myPrepareStackTrace; // 替换成我们自定义方法
Error.stackTraceLimit = 4; // 只捕捉前4层堆栈

// 捕捉放入空对象
const obj = Object.create(null);
Error.captureStackTrace(obj);
obj.stack; // 获得自定义堆栈

// 还原内置stackTraceLimit、prepareStackTrace
Error.prepareStackTrace = prep;
Error.stackTraceLimit = limit;


 另外,myPrepareStackTrace中的stack参数是原始堆栈信息,其结构是一个包含stackTraceLimit个CallSite对象的数组,CallSite拥有丰富的api可以获取每一个堆栈站点的详细信息如:getFileName()、getLineNumber()、getColumnNumber()等。

参考:https://v8.dev/docs/stack-trace-api

 

 

 

分享到:
评论

相关推荐

    Node.js-《Node.js调试指南》

    在Node.js开发过程中,调试是不可或缺的一环,它能帮助我们找出代码中的错误,提高程序的稳定性和效率。《Node.js调试指南》是一份详细总结了Node.js开发中调试技巧和策略的资源,旨在帮助开发者深入理解Node.js的...

    Node.js-stackman-类似Batman但用于Node.js堆栈跟踪

    在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,极大地拓宽了JavaScript的应用范围。而“stackman”是一个专门为Node.js设计的工具,它与名为...

    node-v12.22.12-x64.rar

    在当前的Web开发领域,Node.js和Vue.js是两大不可或缺的技术栈。Node.js作为JavaScript的服务器端运行环境,极大地拓宽了JavaScript的应用场景,而Vue.js则是一款轻量级且功能强大的前端框架,两者结合能构建出高...

    Node.js-devtool-通过ChromeDevTools运行Node.js程序

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程。Chrome DevTools 是一套强大的 Web 开发和调试工具,通常用于前端开发,但它也能与 Node.js 结合...

    Node.js-node-inspector-基于BlinkDeveloperTools的Node.js调试器

    Node.js 是一个开源的、跨平台的 JavaScript 运行环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 的强大之处在于它提供了一个丰富的生态系统,包含了大量的第三方模块,其中 `node-inspector` 就是其中...

    Node.js-Locus是node.js的一个调试模块

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程。Locus 模块是专为 Node.js 设计的一个调试工具,它为开发者提供了一种高效、便捷的方式来调试 Node....

    Node.js-ironNode-利用ChromeDeveloperTools调试DebugNode.js代码

    在Node.js开发中,调试是不可或缺的一个环节,它帮助开发者找出程序中的错误和性能瓶颈。本文将详细介绍如何使用ironNode和Chrome Developer Tools (CDT) 进行高效的Node.js代码调试。 首先,让我们理解ironNode。...

    node14版本和node16版本node14版本和node16版本node14版本和node16版本

    Node.js是JavaScript在服务器端运行的环境,它允许开发者使用JavaScript进行后端开发。...安装完成后,你可以通过命令行工具验证安装的Node.js版本,例如在命令行输入`node -v`,将显示当前系统中安装的Node.js版本。

    Node.js异步错误处理LAEH2.zip

    LAEH2 ( Asynchronous Error Handling v2 for Node.js )是 Node.js 异步错误处理工具。...为减少重复的字符,可以用 /$/ 代替 /node_modules/ ,或者在堆栈轨迹中删除当前目录文件名的前缀。 标签:LAEH2

    NODEJS的v18版本

    虽然Node.js v18是一个当前版本,但请注意它并不是一个长期支持(LTS)版本。对于生产环境,通常建议使用LTS版本以获取更长时间的安全更新和支持。 10. **社区支持**: Node.js v18的发布伴随着广泛的社区支持和...

    vscode 的node.js debugger 的 launch.json 配置详细教程.zip

    在开发JavaScript应用,尤其是Node.js应用时,Visual Studio Code(VSCode)是一个极其受欢迎的集成开发环境(IDE)。其中,其强大的调试工具是开发者的重要助手。这篇教程将深入讲解如何配置VSCode的`launch.json`...

    Node.js-devtools-playground用于原型设计与调试的独立Devtools

    Node.js 是一个基于Chrome V8引擎的JavaScript运行环境,它让开发者可以在服务器端使用JavaScript进行编程,极大地扩展了JavaScript的应用范围。"Node.js-devtools-playground" 是一个专为Node.js开发者设计的独立...

    2019Node.js API 中文版

    Node.js是一个开源、跨平台的JavaScript运行时环境,它允许开发者使用JavaScript编写服务器端应用程序。Node.js的设计基于事件驱动、非阻塞I/O模型,使得它非常适合构建轻量级、高性能的应用程序。 **稳定度** Node...

    用于MongoDB,Node.js和Vue.js的入门级存储库,具有基于Docker的本地环境。-Node.js开发

    堆栈用于MongoDB,Node.js和Vue.js的入门级存储库,具有基于Docker的本地环境。 安装运行堆栈$ docker-compose up从浏览器访问堆栈启动器堆栈与负载均衡器一起使用,该负载均衡器绑定到端口80和443。它当前服务于域...

    mongo-express-react-node-application:使用MongoDB,Express.js,React.js和Node.js创建完整的堆栈应用程序

    3. **Node.js**:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript可以在服务器端执行,打破了JavaScript只能在浏览器中运行的传统。Node.js的非阻塞I/O模型和事件驱动特性使其在高并发场景下...

    mac node-v14.4.0.zip

    标题中的"mac node-v14.4.0.zip"指的是针对Mac操作系统的Node.js版本14.4.0的压缩包文件。Node.js是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的...

    逐步将SSB Node.js堆栈迁移到Rust-Node.js开发

    SSB Neon将SSB Node.js堆栈迁移到Rust,逐渐,SSB Neon模块是用Rust而不是JavaScript编写的npm软件包。 您可以使用npm软件包ssb-neon-something来直接替换ssb-something。 当前,它们是:ssb-neon-keys neon-muxrpc...

    nodejs快速入门

    - **局限性**:当前Node.js还存在一些不足,如SSL支持不够成熟、在Windows平台上的表现不佳以及由V8引擎带来的1GB堆栈内存限制等问题。 - **未来发展**:随着社区的不断发展和完善,这些问题正在逐步得到解决,Node....

    node.js中的console.trace方法使用说明

    在Node.js中,console.trace() 是一个非常有用的内置方法,它用于向标准错误流(stderr)输出当前的调用栈跟踪信息。这个功能对于开发者来说,尤其在进行调试时,非常方便,因为它可以准确地显示出程序执行到 trace...

    node-v10.9.0-cur

    Node.js 是一个开源的、跨平台的 JavaScript 运行环境,它允许开发者在服务器端运行 JavaScript 代码。"node-v10.9.0-cur" 指的是 Node.js 的一个特定版本,即 v10.9.0,通常称为 LTS(长期支持)版本,这些版本在...

Global site tag (gtag.js) - Google Analytics