How to get result of console.trace() as string in javascript with chrome or firefox?

console.trace() outputs its result on console.
I want to get the results as string and save them to a file.

I don't define names for functions and I also can not get their names with callee.caller.name.

73671 次浏览

我不确定是否使用 Firefox,但是在 v8/chrome 中,您可以在 Error 构造函数上使用一个名为 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)}

将在 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 + 提供堆栈跟踪(以字符串数组的形式)

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”。

它不应该在旧的浏览器上崩溃,而只是返回空数组。如果你需要更通用的解决方案,看看 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);
}

我通常需要一个特定级别的堆栈跟踪(用于我的自定义日志记录器) ,因此在调用:

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

你只需要 var stack = new Error().stack。这是@sgouros 答案的简化版。

function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}


foo();

可能不是每个浏览器都能用(可以在 Chrome 中使用)。

我尝试在 NodeJS 和 这个教程中使用 JavaScript 中的字符串变量 Stack Trace 来帮助我。除了堆栈跟踪是通过错误对象而不是 console.trace()打印之外,这在您的场景中也可以工作。

打印堆栈跟踪的代码:

function add(x, y) {
console.log(new Error().stack);
return x+y;
}