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参数是原始堆栈信息,其结构是一个包含stackTraceLimitCallSite对象的数组,CallSite拥有丰富的api可以获取每一个堆栈站点的详细信息如:getFileName()getLineNumber()getColumnNumber()等。
参考:https://v8.dev/docs/stack-trace-api

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Segmentation fault通常是由于程序访问了无效的内存地址而导致的错误。在这种情况下,可能是因为你的node版本存在问题或者系统环境配置出现了异常。以下是一些可能的解决方案: 1. 升级或重新安装Node.js:尝试升级到最新版本的Node.js,或者尝试重新安装当前版本。可以从Node.js官方网站下载最新版本的安装包,并按照指南进行安装。 2. 清除缓存:使用命令`npm cache clean --force`清除npm的缓存,然后再次运行`node -v`命令。 3. 检查系统环境:确保你的操作系统和依赖项都满足Node.js的要求。查看Node.js官方文档所列出的系统要求,并确保你的系统环境与之相匹配。 4. 检查依赖项:如果你在项目使用了其他第三方包或模块,尝试更新或重新安装这些依赖项。有时候,冲突或损坏的依赖项可能会导致Segmentation fault错误。 5. 使用调试工具:你可以尝试使用调试工具来查找导致Segmentation fault错误的具体原因。例如,在Linux系统,可以使用gdb工具进行调试。通过在终端运行`gdb node`命令,然后输入`run`来运行Node.js,当出现Segmentation fault时,可以使用`backtrace`命令查看调用堆栈,以了解错误的来源。 如果以上解决方案都无法解决问题,建议向Node.js社区或相关论坛寻求帮助,提供更详细的错误信息和系统环境信息,以便其他人能够更好地帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值