如何在使用chrome或firefox的javascript中以字符串形式获取console.trace()的结果?
如何在使用chrome或firefox的javascript中以字符串形式获取console.trace()的结果?,javascript,firefox,google-chrome,console,stack-trace,Javascript,Firefox,Google Chrome,Console,Stack Trace,console.trace()在控制台上输出其结果。 我想以字符串形式获取结果并将其保存到文件中。 我没有为函数定义名称,也无法使用callee.caller.name获取它们的名称。我不确定firefox,但在v8/chrome中,您可以在错误构造函数上使用名为captureStackTrace的方法。() 因此,一个简单的方法是: var getStackTrace = function() { var obj = {}; Error.captureStackTrace(obj,
console.trace()
在控制台上输出其结果。我想以字符串形式获取结果并将其保存到文件中。
我没有为函数定义名称,也无法使用
callee.caller.name
获取它们的名称。我不确定firefox,但在v8/chrome中,您可以在错误构造函数上使用名为
captureStackTrace
的方法。()
因此,一个简单的方法是:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
通常,捕获时,
getStackTrace
将位于堆栈上。第二个参数将getStackTrace
排除在堆栈跟踪中。Error.stack是您需要的。它在Chrome和Firefox中工作。比如说
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
将提供铬:
TypeError: Object #<Object> has no method 'debug'
at eval at <anonymous> (unknown source)
at eval (native)
at Object._evaluateOn (unknown source)
at Object._evaluateAndWrap (unknown source)
at Object.evaluate (unknown source)
有一个名为的库可以提供跨浏览器堆栈跟踪。只需包含脚本并在任意点调用即可使用它:
var trace = printStackTrace();
这将为现代Chrome、Firefox、Opera和IE10提供堆栈跟踪(字符串数组)+
function getStackTrace () {
var stack;
try {
throw new Error('');
}
catch (error) {
stack = error.stack || '';
}
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
用法:
console.log(getStackTrace().join('\n'));
它从堆栈中排除了自己的调用以及Chrome和Firefox(但不是IE)使用的标题“Error”
它不应该在旧浏览器上崩溃,而应该返回空数组。如果您需要更通用的解决方案,请查看。它支持的浏览器列表确实令人印象深刻,但在我看来,对于它所要完成的小任务来说,它是非常大的:37Kb的缩小文本,包括所有依赖项 这只是Konstantin优秀代码的一个小改进。它减少了抛出捕获的开销,只是实例化了错误堆栈:
function getStackTrace () {
let stack = new Error().stack || '';
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
我通常需要特定级别的堆栈跟踪(对于我的自定义记录器),因此在调用以下命令时也可以这样做:
getStackTrace()[2]; // get stack trace info 2 levels-deep
您只需要
var stack=new Error()。stack
。这是@sgouros answer的简化版本
函数foo(){
bar();
}
功能条(){
baz();
}
函数baz(){
log(新错误().stack);
}
foo()代码>我试图在NodeJS上的JavaScript中将堆栈跟踪作为字符串变量获取,教程帮助了我。这也适用于您的场景,但堆栈跟踪是通过错误对象而不是console.trace()
打印的
打印堆栈跟踪的代码:
function add(x, y) {
console.log(new Error().stack);
return x+y;
}
console.trace包括异步操作<代码>新错误()。我还在等待更好的答案。谢谢您提供的信息。这在chrome中有效,但在firefox中无效。所以我再次搜索并找到Error().stack
。虽然firefox中的对象和函数名丢失,chrome中的对象名丢失(与Error.captureStackTrace
)相同,Error().stack
可以在两种浏览器中工作,它为我提供了足够的信息进行调试。结果与@Konstantin Smolyanin的答案完全相同。同样有限的细节。这不应该是公认的答案。这里得到的堆栈是“缩减”的,只包含“顶部”,而console.trace()将显示完整的堆栈。请参见堆栈深度为30的示例:谢谢您的回答。但这只有在发生异常时才起作用。我需要毫无例外地获取堆栈跟踪。那么(新错误)呢。stack
这应该会在.debug()上引发一个异常——获取堆栈是一种昂贵的方法,但应该可以工作。当试图从只能在,例如,PhantomJS或出于任何原因的类似产品。我会看到实现已更改为支持ES6承诺。请注意,目前应使用:(新版本尚未发布)这在PhantomJS中不起作用:(
function add(x, y) {
console.log(new Error().stack);
return x+y;
}