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

Javascript 使用firebug打印整个程序的函数日志/堆栈跟踪,javascript,firebug,Javascript,Firebug,Firebug能够记录对特定函数名的调用。我正在寻找一个bug,它有时会阻止页面呈现,但不会导致任何错误或警告。这个错误只出现了大约一半的时间。那么,如何获取整个程序的所有函数调用的列表,或整个程序执行的某种堆栈跟踪?尝试一次一行或一个函数遍历代码,以确定它在何处停止正常工作。或者进行一些合理的猜测,并在代码中散布日志语句。当我需要堆栈跟踪时,我会执行以下操作,也许您可以从中获得一些启示: function logStackTrace(levels) { var callstack =

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

尝试一次一行或一个函数遍历代码,以确定它在何处停止正常工作。或者进行一些合理的猜测,并在代码中散布日志语句。

当我需要堆栈跟踪时,我会执行以下操作,也许您可以从中获得一些启示:

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'));
    }
};
功能日志堆栈跟踪(级别){
var callstack=[];
var isCallstackPopulated=false;
试一试{
i、 dont.exist+=0;//不存在-这就是重点
}捕获(e){
if(e.stack){//Firefox/chrome
var lines=e.stack.split('\n');
对于(变量i=0,len=lines.length;i
版主备注:此答案中的代码似乎也出现在中。不过,此答案的作者声称这是他自己的代码,是在此处链接的博客文章之前编写的。出于真诚的目的,我添加了该文章和此备注的链接。

console.trace()
这对于打印调用堆栈非常方便。在和中也可以使用

或者,尝试以下方法:

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

我在没有firebug的情况下完成了这项工作。在chrome和firefox中进行了测试:

console.error("I'm debugging this code.");
程序将其打印到控制台后,您可以单击指向它的小箭头以展开调用堆栈。

尝试以下操作:

console.trace()

我不知道是否所有浏览器都支持它,所以我会先检查它是否存在。

这一点。一定要在函数中添加
console.log('something')
语句,看看哪些是(哪些不是)被调用程序是巨大的,因此我正在寻找一种方法来比较程序何时正确运行与何时没有正确运行的函数日志。我同意这将是有用的。我参与进来是为了拥有一个庞大的代码库,能够生成所有函数调用的运行跟踪的东西肯定会有助于了解流程/shape的代码和检测死代码。有一个控制台。trace()你可以在Firebug中打电话,这样做。这太棒了。Firebug在缩小文件方面有问题,这个脚本就做到了!FWIW@andrew barber,《答案》的作者从未声称自己是作者。只是没有属性。你的编辑应该是一个注释。有没有办法增加堆栈的长度?这将非常有用。✚1 console.warn(“[warn]调用堆栈:”,new Error().STACK);