如何使用chrome或firefox在javascript中将console.trace()的结果作为字符串?

Posted

技术标签:

【中文标题】如何使用chrome或firefox在javascript中将console.trace()的结果作为字符串?【英文标题】:How to get result of console.trace() as string in javascript with chrome or firefox? 【发布时间】:2011-10-06 15:10:20 【问题描述】:

console.trace() 在控制台上输出结果。 我想以字符串形式获取结果并将它们保存到文件中。 我没有为函数定义名称,也无法使用callee.caller.name 获取它们的名称。

【问题讨论】:

这在 PhantomJS 中不起作用 :( 【参考方案1】:

我不确定 firefox,但在 v8/chrome 中,您可以在 Error 构造函数上使用名为 captureStackTrace 的方法。 (More info here)

因此,获得它的一种 hacky 方法是:

var getStackTrace = function() 
  var obj = ;
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
;

console.log(getStackTrace());

通常,getStackTrace 在被捕获时会在堆栈中。那里的第二个参数将 getStackTrace 排除在堆栈跟踪中。

【讨论】:

感谢您的信息。这在 chrome 中有效,但在 Firefox 中无效。于是我再次搜索,发现Error().stack。虽然对象和函数名称在 Firefox 中丢失,对象名称在 chrome 中丢失(与 Error.captureStackTrace 相同),但 Error().stack 可以在两种浏览器中使用,它为我提供了足够的信息进行调试。 与@Konstantin Smolyanin 的答案完全相同。结果同样有限的细节。 这不应该是公认的答案。您在此处获得的堆栈是“缩减”的,仅包含“顶部”,而 console.trace() 将显示完整堆栈。在此处查看堆栈深度为 30 的示例:***.com/questions/62768598/…【参考方案2】:

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

【讨论】:

感谢您的回答。但这仅在发生异常时才有效。我需要毫无例外地获取堆栈跟踪。 (new Error).stack怎么样 这应该在 a.debug() 上抛出异常——这是一种获取堆栈的昂贵方法,但应该可以。 这种方法在尝试从一些只能运行的代码中获取跟踪时也很方便,例如无论出于何种原因,PhantomJS 之类的。【参考方案3】:

这将为现代 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)使用的标题“错误”。

它不应该在旧浏览器上崩溃,而只是返回空数组。如果您需要更通用的解决方案,请查看stacktrace.js。它支持的浏览器列表确实令人印象深刻,但在我看来,它对于它的小任务来说非常大:37Kb 的缩小文本,包括所有依赖项。

【讨论】:

【参考方案4】:

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

var trace = printStackTrace();

【讨论】:

我会查看github.com/stacktracejs/stacktrace.js,因为实现已更改为支持 ES6 承诺。 请注意,现在应该使用:github.com/stacktracejs/stacktrace.js/tree/stable?files=1(新版本尚未发布)【参考方案5】:

这只是对 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

【讨论】:

【参考方案6】:

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

function foo() 
  bar();

function bar() 
  baz();

function baz() 
  console.log(new Error().stack);


foo();

可能无法在所有浏览器中运行(在 Chrome 中运行)。

【讨论】:

【参考方案7】:

我试图在 NodeJS 上的 javascript 中将 Stack Trace 作为字符串变量,this 教程帮助了我。这也适用于您的场景,除非堆栈跟踪是通过错误对象而不是 console.trace() 打印的。

打印堆栈跟踪的代码:

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

【讨论】:

这个更准确,跨平台,甚至在 nodejs 上也能工作。

以上是关于如何使用chrome或firefox在javascript中将console.trace()的结果作为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用chrome或firefox在javascript中将console.trace()的结果作为字符串?

如何在 Chrome 开发者工具或 Firefox 的 Firebug 中验证 XPath 表达式?

如何模拟像素比以在 Windows 上使用 Google Chrome 或 Firefox 测试媒体查询?

如何在 Chrome 或 Firefox 中打印特定的 HTML 元素而不是整个页面?

在 Firefox 或 Chrome 等浏览器上没有任何配置的情况下,如何在 OBIEE 12c 登录页面中忘记密码?

在 Firefox/Chrome 上打开新标签页或窗口时,如何获得新的浏览器会话?