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


94

Firebug可以记录对特定函数名称的调用。我正在寻找一个有时会导致页面无法呈现但不会引起任何错误或警告的错误。该错误仅出现大约一半的时间。那么,如何获得整个程序的所有函数调用的列表,或执行整个程序的某种堆栈跟踪?

Answers:



13

当我需要堆栈跟踪时,请执行以下操作,也许您可​​以从中得到一些启发:

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

主持人的笔记:答案中的代码似乎也出现在Eric Wenderlin博客的这篇文章中。不过,此答案的作者声称它是自己的代码,写在此处链接的博客文章之前。出于诚实的目的,我已将链接添加到帖子和本说明中。


2
您可以在Firebug中进行一个console.trace()调用来执行此操作。
2011年

太好了 Firebug在缩小文件方面遇到麻烦,此脚本可以做到!
pstadler

1
FWIW @ andrew-barber,答案的作者从未声称是他自己的。只是没有属性。您的编辑应该是评论。
Ascherer 2015年

7

我没有萤火虫就做到了。在chrome和Firefox中测试过:

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

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


2

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


2
这个。一定console.log('something')要在函数中添加语句负载,以查看正在(或不)调用哪些语句
Gareth

1
该程序非常庞大,因此我正在寻找一种比较功能日志的方法,以确定程序何时正确运行以及何时不正确运行。
2011年

1
我同意这将是有用的。我要获得大型代码库的所有权,并且可以生成所有函数调用的运行跟踪的东西肯定会帮助您了解代码的流程/形状并检测无效代码。
马修·尼科尔斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.