javascript replacement Stampa il registro delle funzioni/traccia dello stack per l'intero programma usando firebug




ie11 firebug (4)

Firebug ha la possibilità di registrare le chiamate su un particolare nome di funzione. Sto cercando un bug che a volte interrompa una pagina dal rendering, ma non causa errori o avvertimenti. Il bug appare solo circa la metà delle volte. Quindi, come posso ottenere un elenco di tutte le chiamate alle funzioni per l'intero programma o qualche tipo di traccia dello stack per l'esecuzione dell'intero programma?


Ho realizzato questo senza firebug. Testato sia in chrome che in firefox:

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

Una volta che il programma lo ha stampato sulla console, è possibile fare clic sulla piccola freccia su di esso per espandere lo stack di chiamate.


Firefox fornisce console.trace() che è molto utile per stampare lo stack delle chiamate. È anche disponibile in Chrome e IE 11 .

In alternativa, prova qualcosa del genere:

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

Quando ho bisogno di una traccia dello stack faccio quanto segue, forse puoi trarre qualche ispirazione da esso:

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

Nota del moderatore : il codice in questa risposta sembra apparire anche in questo post dal blog di Eric Wenderlin . L'autore di questa risposta lo rivendica come se fosse il suo stesso codice, scritto prima del post del blog collegato qui. Solo per motivi di buona fede, ho aggiunto il link al post e questa nota.


Prova a passare attraverso il codice una riga o una funzione alla volta per determinare dove smette di funzionare correttamente. Oppure fai alcune ipotesi ragionevoli e diffondi dichiarazioni di registrazione attraverso il tuo codice.





firebug