2011-01-12 7 views
61

Firebug tiene la capacidad de registrar llamadas a un nombre de función particular. Estoy buscando un error que a veces detiene el procesamiento de una página, pero no causa ningún error o advertencia. El error solo aparece la mitad del tiempo. 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?Imprimir registro de función/pila para todo el programa utilizando firebug

Respuesta

149

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

tratar Alternativamente algo como esto:

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

+1 console.trace() – chim

+0

esto es genial :) – iamawebgeek

+0

¿Hay alguna manera de aumentar la longitud de la pila? Eso sería muy util. –

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 disemine las instrucciones de registro a través de su código.

+1

Esto. Definitivamente agregue una carga de instrucciones 'console.log ('something')' a sus funciones para ver cuáles se llaman (y no) – Gareth

+0

El programa es enorme, entonces estoy buscando una forma de comparar registros de funciones para cuando el programa se ejecutó correctamente vs cuando no lo hizo. – amccormack

+0

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 puede generar un seguimiento de todas las llamadas de función sin duda ayudaría a obtener una idea del flujo/forma del código y detectar el código muerto. –

10

cuando necesito un seguimiento de pila hago lo siguiente, tal vez usted puede sacar algo de inspiración de ella:

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

del moderador nota: El código de esta respuesta parece a aparecer también en this post from Eric Wenderlin's blog. Sin embargo, el autor de esta respuesta lo reclama como su propio código, escrito antes de la publicación del blog vinculada aquí. Solo para propósitos de buena fe, agregué el enlace a la publicación y a esta nota.

+2

Hay una llamada a console.trace() que puede hacer en Firebug que hace esto. – amccormack

+0

Esto es brillante. Firebug tiene problemas con los archivos minificados, ¡este script lo hace! – pstadler

+0

FWIW @ andrew-barber, autor de la respuesta nunca reclamada como suya. Simplemente no lo atribuí. Tu edición debe ser un comentario. – Ascherer

2

he logrado esto sin incendiario. Probado tanto en Chrome y Firefox:

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

Una vez impreso el programa que a la consola, puede hacer clic en la flecha pequeña para que se expanda la pila de llamadas.

Cuestiones relacionadas