web-dev-qa-db-fra.com

Journal des fonctions d'impression / trace de pile pour tout le programme à l'aide de Firebug

Firebug a la possibilité de consigner les appels sous un nom de fonction particulier. Je recherche un bogue qui empêche parfois le rendu d'une page, mais ne provoque aucune erreur ni aucun avertissement. Le bogue n'apparaît que la moitié du temps environ. Alors, comment puis-je obtenir une liste de tous les appels de fonction pour l'ensemble du programme, ou une sorte de trace de pile pour l'exécution du programme entier?

89
amccormack

Firefox fournitconsole.trace() qui est très pratique pour imprimer la pile d'appels. Il est également disponible dans Chrome et IE 11 .

Sinon, essayez quelque chose comme ça:

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

Quand j'ai besoin d'une trace de pile, je fais ce qui suit, vous pouvez peut-être en tirer quelques inspirations:

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

Note du modérateur : Le code dans cette réponse semble également apparaître dans ce message du blog d'Eric Wenderlin . L'auteur de cette réponse le réclame comme son propre code, bien qu'il soit écrit avant la publication du blog liée ici. Juste pour des raisons de bonne foi, j'ai ajouté le lien vers le post et cette note.

13
Martin Jespersen

J'ai accompli cela sans firebug. Testé à la fois chrome et firefox:

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

Une fois que votre programme l'a imprimée sur la console, vous pouvez cliquer sur la petite flèche pour développer la pile d'appels.

6
satnam

Essayez de parcourir votre code ligne par ligne ou une fonction à la fois pour déterminer où il ne fonctionne plus correctement. Ou faites des suppositions raisonnables et des déclarations de journalisation dispersées dans votre code.

2
casablanca