如何在使用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;
}