使用萤火虫打印整个程式的functionlogging/堆栈追踪

Firebug能够将呼叫logging到特定的function名称。 我正在寻找一个bug,有时会停止渲染页面,但不会导致任何错误或警告。 该错误只出现大约一半的时间。 那么如何获得整个程序的所有函数调用的列表,或者执行整个程序的某种堆栈跟踪呢?

Firefox提供了 console.trace() ,这非常方便打印调用堆栈。 它也可以在Chrome和IE 11中使用 。

或者尝试这样的事情:

 function print_call_stack() { var stack = new Error().stack; console.log("PRINTING CALL STACK"); console.log( stack ); } 

当我需要一个堆栈跟踪,我做了以下,也许你可以从中得到一些启发:

 function logStackTrace(levels) { var callstack = []; var isCallstackPopulated = false; try { i.dont.exist += 0; //doesn't exist- that's the point } catch (e) { if (e.stack) { //Firefox / chrome var lines = e.stack.split('\n'); for (var i = 0, len = lines.length; i < len; i++) { callstack.push(lines[i]); } //Remove call to logStackTrace() callstack.shift(); isCallstackPopulated = true; } else if (window.opera && e.message) { //Opera var lines = e.message.split('\n'); for (var i = 0, len = lines.length; i < len; i++) { if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { var entry = lines[i]; //Append next line also since it has the file info if (lines[i + 1]) { entry += " at " + lines[i + 1]; i++; } callstack.push(entry); } } //Remove call to logStackTrace() callstack.shift(); isCallstackPopulated = true; } } if (!isCallstackPopulated) { //IE and Safari var currentFunction = arguments.callee.caller; while (currentFunction) { var fn = currentFunction.toString(); var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous"; callstack.push(fname); currentFunction = currentFunction.caller; } } if (levels) { console.log(callstack.slice(0, levels).join('\n')); } else { console.log(callstack.join('\n')); } }; 

主持人的说明 :这个答案中的代码似乎也出现在这篇文章从埃里克温德林的博客 。 这个答案的作者声称这是他自己的代码,虽然写在这里链接的博客文章之前。 只是出于善意的目的,我已经添加了该post和本说明的链接。

尝试一次一行或一个函数地逐行浏览代码,以确定它停止正常工作的位置。 或者通过您的代码进行一些合理的猜测并分散日志logging。

我没有萤火虫做到了。 testing在铬和Firefox:

 console.error("I'm debugging this code."); 

一旦你的程序打印到控制台,你可以点击它的小箭头展开调用堆栈。