使用 firebug 打印整个程序的函数日志/堆栈跟踪

Firebug 能够记录对特定函数名的调用。我正在寻找一个错误,有时停止从呈现页面,但不会导致任何错误或警告。这种病毒只有大约一半的时间会出现。那么我如何得到整个程序的所有函数调用的列表,或者整个程序执行的某种堆栈跟踪?

64872 次浏览

Try stepping through your code one line or one function at a time to determine where it stops working correctly. Or make some reasonable guesses and scatter logging statements through your code.

When i need a stack trace i do the following, maybe you can draw some inspiration from it:

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'));
}
};

Moderator's note: The code in this answer seems to also appear in this post from Eric Wenderlin's blog. The author of this answer claims it as his own code, though, written prior to the blog post linked here. Just for purposes of good-faith, I've added the link to the post and this note.

Firefox provides console.trace() which is very handy to print the call stack. It is also available in Chrome and IE 11.

Alternatively try something like this:

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

I accomplished this without firebug. Tested in both chrome and firefox:

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

Once your program prints that to the console, you can click the little arrow to it to expand the call stack.

Try this:

console.trace()

I don't know if it's supported on all browsers, so I would check if it exists first.