我试图在代码中的给定位置获取堆栈跟踪作为变量。
目前我一直在尝试使用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()的输出?
1条答案
按热度按时间uqdfh47h1#
这里我不完全确定,但是异步调用实际上可能不是调用堆栈的一部分。
console.trace()
documentation如下所示:如果是这种情况,可能无法以编程方式获取调用堆栈,除非重写所有函数以及setTimeout和setInterval(以及setImmediate),以某种方式手动跟踪它们的调用。