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

时间:2011-01-12 16:12:42

标签: javascript firebug

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

5 个答案:

答案 0 :(得分:203)

Firefox provides console.trace() ,打印调用堆栈非常方便。它也可以在ChromeIE 11中使用。

或者尝试这样的事情:

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

答案 1 :(得分:12)

当我需要堆栈跟踪时,我会执行以下操作,也许您可​​以从中获取灵感:

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

主持人的说明:此答案中的代码似乎也出现在this post from Eric Wenderlin's blog中。这个答案的作者声称它是他自己的代码,但是在这里链接的博客文章之前写的。出于善意的目的,我已经添加了帖子和本说明的链接。

答案 2 :(得分:6)

我没有萤火虫就完成了这件事。在chrome和firefox中都进行了测试:

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

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

答案 3 :(得分:2)

尝试一次单步执行代码或一个函数,以确定它停止正常工作的位置。或者通过代码进行一些合理的猜测并分散日志记录语句。

答案 4 :(得分:0)

尝试一下:

console.trace()

我不知道所有浏览器是否支持它,因此我将首先检查它是否存在。