掌握 JS Stack Trace

本文介绍了JavaScript中的Stack Trace,从队列和栈的概念出发,深入探讨了函数调用、Error对象、堆栈追踪、作用域链、JS执行机制、垃圾回收以及内存泄漏。通过实例分析了函数调用过程中的栈操作,并讲解了如何识别和避免内存泄漏问题。
摘要由CSDN通过智能技术生成

在使用 Roadhog 编译过程中,我的终端崩掉了,怀着好奇的心理,我找到了 JS Stack Trace 这样的提示,怎么理解呢,这节我们来探究一下。

本文并不会告诉你“终端崩溃了,如何解决?”,我只会围绕 “JS Stack Trace” 异常来分析,我们可能碰到了什么问题,以及需要了解的相关技术栈。

一、队列(Queue)与栈(Stack)

最早是在数据结构的线性表中接触到队列(Queue)与栈(Stack),我们先来回顾一下概念:

  • 栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足 “FIFO:First In Last Out”;
  • 队列只允许在表尾插入数据元素,在表头删除数据元素,满足 “First In First Out”。

这里我们不去纠结栈与队列的异同,而只去用概念去理解 JS 中 Stack。

二、Stack

我们先来看这样一段代码,试想一下输出结果,以及它是如何调用的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function c() {
        
console.log('c');
}

function b() {
console.log('b');
c();
}

function a() {
console.log('a');
b();
}

a();

对上面的代码做一下简短的分析:

  • 当调用 a 的时候,它会被压到栈顶;
  • 然后,当 b 在 a 中被调用的时候,它会被继续压入栈顶,当 c 在 b 中被调用的时候,也一样;
  • 在运行 c 的时候,栈中包含了 a,b,c,并且其顺序也是 a,b,c;
  • 当 c 调用完毕时,它会被从栈顶移出,随后控制流回到 b。当 b 执行完毕后也会从栈顶移出,控制流交还到 a。最后,当 a 执行完毕后也会从栈中移出。

每当有一个函数调用,就会将其压入栈顶。在调用结束的时候再将其从栈顶移出。

补充一点: 我们可以用 console.trace()Stack Trace 打印到控制台。

三、Error

Error 发生的时候,通常会抛出一个 Error 对象。Error 对象也可以

C中的stacktrace是指在程序运行过程中,记录函数调用关系和执行位置的一种机制。当程序发生错误或异常情况时,可以通过stacktrace来定位问题发生的位置,帮助开发人员进行调试和错误修复。 在C语言中,stacktrace可以通过获取函数调用栈来实现。函数调用栈是一个存储函数调用关系和局部变量的数据结构,栈顶表示当前正在执行的函数。可以通过以下几种方法来获取C的stacktrace: 1. 使用调试工具:在开发环境中,可以使用调试工具(如GDB)来获取stacktrace。通过设置断点或捕捉异常,可以在程序执行过程中暂停并查看函数调用栈的信息。 2. 异常处理:在代码中可以使用异常处理机制来捕获异常,并将stacktrace作为异常信息输出。可以使用`backtrace`和`backtrace_symbols`等函数获取函数调用栈的信息,并将其打印出来。 3. 自定义实现:也可以自己编写代码来实现获取stacktrace的功能。使用函数指针的方式,将每个函数的调用关系保存在一个自定义的数据结构中,并在需要时打印出来。 无论使用哪种方法,获取stacktrace可以帮助开发人员更快地定位问题发生的位置,从而快速解决bug。在生产环境中,由于性能和安全等方面的考虑,通常需要做一些限制,避免泄露敏感信息。因此,在实际应用中需要根据具体需求来选择合适的方法来获取stacktrace
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值