如何使用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 元素而不是整个页面?