Drucken Sie das Funktionsprotokoll / die Stapelverfolgung für das gesamte Programm mit Firebug

94

Firebug kann Aufrufe an einen bestimmten Funktionsnamen protokollieren. Ich suche nach einem Fehler, der manchmal das Rendern einer Seite verhindert, aber keine Fehler oder Warnungen verursacht. Der Fehler tritt nur etwa zur Hälfte auf. Wie erhalte ich eine Liste aller Funktionsaufrufe für das gesamte Programm oder eine Art Stack-Trace für die Ausführung des gesamten Programms?

Amccormack
quelle

Antworten:

217

Firefox bietet console.trace() eine sehr praktische Möglichkeit , den Aufrufstapel zu drucken. Es ist auch in Chrome und IE 11 verfügbar .

Alternativ können Sie Folgendes ausprobieren:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}
Matt Schwartz
quelle
2
Gibt es eine Möglichkeit, die Länge des Stapels zu erhöhen? Das wäre sehr hilfreich.
Ravi Teja
✚1 console.warn ('[WARN] CALL STACK:', neuer Fehler (). Stack);
user1742529
13

Wenn ich einen Stack-Trace benötige, mache ich Folgendes: Vielleicht können Sie sich davon inspirieren lassen:

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

Anmerkung des Moderators : Der Code in dieser Antwort scheint auch in diesem Beitrag aus Eric Wenderlins Blog zu erscheinen . Der Autor dieser Antwort behauptet jedoch, es sei sein eigener Code, der vor dem hier verlinkten Blog-Beitrag geschrieben wurde. Nur aus Gründen von Treu und Glauben habe ich den Link zum Beitrag und diesen Hinweis hinzugefügt.

Martin Jespersen
quelle
2
Es gibt einen Aufruf von console.trace (), den Sie in Firebug ausführen können.
Amccormack
Das ist brilliant. Firebug hat Probleme mit minimierten Dateien, dieses Skript macht es!
Pstadler
1
FWIW @ andrew-barber, Autor der Antwort, hat nie behauptet, er sei sein eigener. Einfach nicht zugeschrieben. Ihre Bearbeitung sollte ein Kommentar sein.
Ascherer
7

Ich habe das ohne Feuerwanze geschafft. Getestet in Chrom und Firefox:

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

Sobald Ihr Programm dies auf der Konsole druckt, können Sie auf den kleinen Pfeil klicken, um den Aufrufstapel zu erweitern.

Satnam
quelle
2

Versuchen Sie, Ihren Code zeilenweise oder einzeln durchzugehen, um festzustellen, wo er nicht mehr richtig funktioniert. Oder machen Sie einige vernünftige Vermutungen und streuen Sie Protokollierungsanweisungen durch Ihren Code.

casablanca
quelle
2
Dies. Fügen Sie auf jeden Fall eine Menge console.log('something')Anweisungen zu Ihren Funktionen hinzu, um zu sehen, welche aufgerufen werden (und welche nicht)
Gareth
1
Das Programm ist riesig, daher suche ich nach einer Möglichkeit, Funktionsprotokolle zu vergleichen, wenn das Programm korrekt ausgeführt wurde, und wenn dies nicht der Fall war.
Amccormack
1
Ich stimme zu, dass dies nützlich wäre. Ich bin dabei, eine große Codebasis zu übernehmen, und etwas, das eine laufende Ablaufverfolgung aller Funktionsaufrufe generieren kann, würde sicherlich dazu beitragen, einen Eindruck vom Fluss / der Form des Codes zu bekommen und toten Code zu erkennen.
Matthew Nichols
1

Versuche dies:

console.trace()

Ich weiß nicht, ob es von allen Browsern unterstützt wird, daher würde ich zuerst prüfen, ob es vorhanden ist.

Abraham Albero
quelle