我正在try 以变量的形式获取代码中给定位置的堆栈跟踪.

目前,我一直在try 使用console.trace()new Error().stack,但它们并不是最优的. 前者将堆栈打印到控制台,而我想将其保存在一个变量中,而后者不能正确处理setTimeout等异步函数调用.

例如,使用以下代码:

var getStackTrace = function() {
  var obj = {};
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
};

function f(){
    console.log(getStackTrace());
}

function f1(){
    setTimeout(f);
}

f1();

我只能得到:

VM3498:2 Error
    at f (<anonymous>:2:17)

而如果我使用console.trace():

function f(){
    console.trace();
}

function f1(){
    setTimeout(f);
}

f1();

我得到了:

f   @   VM4219:2
setTimeout (async)      
f1  @   VM4219:6
(anonymous) @   VM4219:9

这是完整的,但直接在控制台中打印.

有没有办法在变量中获取完整的堆栈跟踪或获得console.trace()的输出?

推荐答案

我在这里不完全确定,但异步调用实际上可能不是调用堆栈的一部分.console.trace() documentation的内容如下:

Note: In some browsers, console.trace() may also output the sequence of 
calls and asynchronous events leading to the current console.trace() which 
are not on the call stack — to help identify the origin of the current 
event evaluation loop.

如果是这种情况,可能无法以编程方式获取调用堆栈,除非您重写所有函数以及setTimeout和setInterval(以及setImmediate)以某种方式手动跟踪它们的调用.

Javascript相关问答推荐

不渲染具有HTML参数的React元素

fetch在本地设置相同来源的cookie,但部署时相同的代码不会设置cookie

使用print This时, map 容器已在LeafletJS中初始化

对象和数字减法会抵消浏览器js中的数字

成帧器运动中的运动组件为何以收件箱开始?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

硬币兑换运行超时

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

为什么按钮会随浮动属性一起移动?

保持物品顺序的可变大小物品分配到平衡组的算法

检索相加到点的子项

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

在css中放置所需 colored颜色 以填充图像的透明区域

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

Node.js API-queryAll()中的MarkLogic数据移动

使用Reaction窗体挂钩注册日历组件

通过解构/功能组件接收props-prop验证中缺少错误"

当达到高度限制时,如何裁剪图像?使用html和css

如何阻止外部脚本进入顶层导航