Imprimer le journal des fonctions / trace de la pile pour l'ensemble du programme à l'aide de Firebug

94

Firebug a la capacité de consigner les appels à un nom de fonction particulier. Je recherche un bug qui arrête parfois le rendu d'une page, mais ne provoque aucune erreur ou 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 de l'ensemble du programme?

amccormack
la source

Réponses:

218

Firefox fournit console.trace() ce 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 ceci:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}
Matt Schwartz
la source
2
Existe-t-il un moyen d'augmenter la longueur de la pile? Ce serait très utile.
Ravi Teja le
✚1 console.warn ('[WARN] CALL STACK:', new Error (). Stack);
user1742529
13

Lorsque j'ai besoin d'une trace de pile, je fais ce qui suit, peut-être pouvez-vous vous en inspirer:

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 de cette réponse semble également apparaître dans cet article du blog d'Eric Wenderlin . L'auteur de cette réponse le revendique comme son propre code, écrit avant le billet de blog lié ici. Juste pour des raisons de bonne foi, j'ai ajouté le lien vers l'article et cette note.

Martin Jespersen
la source
2
Il y a un appel console.trace () que vous pouvez faire dans Firebug qui fait cela.
amccormack
C'est génial. Firebug a des problèmes avec les fichiers minifiés, ce script le fait!
pstadler
1
FWIW @ andrew-barber, l'auteur de la réponse n'a jamais prétendu être la sienne. Je n'ai tout simplement pas attribué. Votre modification doit être un commentaire.
Ascherer
7

J'ai accompli cela sans firebug. Testé dans Chrome et Firefox:

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

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

satnam
la source
2

Essayez de parcourir votre code une ligne ou une fonction à la fois pour déterminer où il cesse de fonctionner correctement. Ou faites des suppositions raisonnables et des instructions de journalisation dispersée dans votre code.

casablanca
la source
2
Ce. Ajoutez définitivement un tas d' console.log('something')instructions à vos fonctions pour voir lesquelles sont (et ne sont pas) appelées
Gareth
1
Le programme est énorme, donc je cherche un moyen de comparer les journaux de fonction pour quand le programme a fonctionné correctement et quand il ne l'a pas fait.
amccormack
1
Je conviens que ce serait utile. J'interviens pour m'approprier une grande base de code et quelque chose qui peut générer une trace en cours de tous les appels de fonction aiderait certainement à avoir une idée du flux / forme du code et de détecter le code mort.
Matthew Nichols
1

Essaye ça:

console.trace()

Je ne sais pas s'il est pris en charge sur tous les navigateurs, alors je vérifierais d'abord s'il existe.

Abraham Albero
la source