Chrome 获取完整的堆栈跟踪作为变量

ykejflvf  于 2023-03-27  发布在  Go
关注(0)|答案(1)|浏览(280)

我试图在代码中的给定位置获取堆栈跟踪作为变量。
目前我一直在尝试使用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()的输出?

uqdfh47h

uqdfh47h1#

这里我不完全确定,但是异步调用实际上可能不是调用堆栈的一部分。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),以某种方式手动跟踪它们的调用。

相关问题