如何获得console.trace()作为string与Chrome或Firefox的JavaScript的结果?

console.trace()在控制台上输出结果。
我想获得结果作为string,并将其保存到一个文件。

我没有为函数定义名称,也无法使用callee.caller.name获取它们的名称。

我不确定firefox,但是在v8 / chrome中,您可以在名为captureStackTrace的Error构造函数上使用一个方法。 ( 更多信息在这里 )

所以一个黑客的方式来得到它将是:

 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)} 

将在Chrome中提供:

 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) 

在Firefox中:

 @http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};") @http://www.google.com.ua/:87 _firebugEvalEvent([object Event]) @http://www.google.com.ua/:67 

有一个名为stacktrace.js的库,可以为您提供跨浏览器堆栈跟踪。 您可以简单地通过包含脚本并在任何时候调用来使用它:

 var trace = printStackTrace(); 

这将为现代的Chrome,Firefox,Opera和IE10 +提供堆栈跟踪(作为string数组)

 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)使用的标题“错误”。

它不应该在旧的浏览器崩溃,但只是返回空数组。 如果你需要更多的通用解决scheme,请看stacktrace.js 。 它支持的浏览器列表真的很让人印象深刻,但在我看来,这是一个很小的任务,它的目标是: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); } 

我通常需要特定级别的堆栈跟踪(对于我的自定义日志logging器),所以在调用时也可以这样做:

 getStackTrace()[2]; // get stack trace info 2 levels-deep