Imprimir registro de función / seguimiento de pila para todo el programa usando firebug

94

Firebug tiene la capacidad de registrar llamadas a un nombre de función en particular. Estoy buscando un error que a veces impide que una página se muestre, pero no causa ningún error ni advertencia. El error solo aparece la mitad de las veces. Entonces, ¿cómo obtengo una lista de todas las llamadas a funciones para todo el programa, o algún tipo de seguimiento de pila para la ejecución de todo el programa?

amccormack
fuente

Respuestas:

218

Firefox proporciona lo console.trace() que es muy útil para imprimir la pila de llamadas. También está disponible en Chrome e IE 11 .

Alternativamente, intente algo como esto:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}
Matt Schwartz
fuente
2
¿Hay alguna forma de aumentar la longitud de la pila? Eso sería muy util.
Ravi Teja
✚1 console.warn ('[WARN] CALL STACK:', nuevo Error (). Stack);
user1742529
13

Cuando necesito un seguimiento de pila, hago lo siguiente, tal vez puedas inspirarte en él:

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 moderador : el código de esta respuesta parece aparecer también en esta publicación del blog de Eric Wenderlin . Sin embargo, el autor de esta respuesta lo afirma como su propio código, escrito antes de la publicación del blog vinculada aquí. Solo por motivos de buena fe, agregué el enlace a la publicación y esta nota.

Martin Jespersen
fuente
2
Hay una llamada a console.trace () que puedes hacer en Firebug que hace esto.
amccormack
Esto es brillante. Firebug tiene problemas con los archivos minificados, ¡este script lo hace!
pstadler
1
FWIW @ andrew-barber, autor de la respuesta que nunca reclamó como propia. Simplemente no atribuí. Tu edición debe ser un comentario.
Ascherer
7

Logré esto sin firebug. Probado tanto en Chrome como en Firefox:

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

Una vez que su programa imprima eso en la consola, puede hacer clic en la pequeña flecha para expandir la pila de llamadas.

satnam
fuente
2

Intente recorrer su código una línea o una función a la vez para determinar dónde deja de funcionar correctamente. O haga algunas conjeturas razonables y distribuya las declaraciones de registro a través de su código.

casablanca
fuente
2
Esta. Definitivamente agregue una carga de console.log('something')declaraciones a sus funciones para ver cuáles son (y cuáles no) están siendo llamadas
Gareth
1
El programa es enorme, por lo que estoy buscando una forma de comparar los registros de funciones de cuándo el programa se ejecutó correctamente y cuándo no.
amccormack
1
Estoy de acuerdo en que esto sería útil. Estoy interviniendo para tomar posesión de una gran base de código y algo que pueda generar un seguimiento en ejecución de todas las llamadas a funciones sin duda ayudaría a tener una idea del flujo / forma del código y detectar el código muerto.
Matthew Nichols
1

Prueba esto:

console.trace()

No sé si es compatible con todos los navegadores, así que primero comprobaría si existe.

Abraham Albero
fuente