2009-10-01 9 views
6

Me encontré con este método para producir un seguimiento de pila de Javascript (para arreglar un error específico de IE): http://pastie.org/253058.txt que suena realmente útil, pero cuando lo llamo, La traza de pila que obtengo es para el código del script en sí.JavaScript Stack Trace en IE (o quizás solo un simple error de Javascript)

¿Se puede cambiar este código para generar un seguimiento de pila general? ¿O hay una mejor manera de obtener un seguimiento de pila en IE?

(function() { 

YOUR_NAMESPACE.getStackTrace = (function() { 

var mode; 
try {(0)()} catch (e) { 
    mode = e.stack ? 'Firefox' : window.opera ? 'Opera' : 'Other'; 
} 

switch (mode) { 
    case 'Firefox' : return function() { 
     try {(0)()} catch (e) { 
      return e.stack.replace(/^.*?\n/,''). 
          replace(/(?:\[email protected]:0)?\s+$/m,''). 
          replace(/^\(/gm,'{anonymous}('). 
          split("\n"); 
     } 
    }; 

    case 'Opera' : return function() { 
     try {(0)()} catch (e) { 
      var lines = e.message.split("\n"), 
       ANON = '{anonymous}', 
       lineRE = /Line\s+(\d+).*?in\s+(http\S+)(?:.*?in\s+function\s+(\S+))?/i, 
       i,j,len; 

      for (i=4,j=0,len=lines.length; i<len; i+=2) { 
       if (lineRE.test(lines[i])) { 
        lines[j++] = (RegExp.$3 ? 
         RegExp.$3 + '()@' + RegExp.$2 + RegExp.$1 : 
         ANON + RegExp.$2 + ':' + RegExp.$1) + 
         ' -- ' + lines[i+1].replace(/^\s+/,''); 
       } 
      } 

      lines.splice(j,lines.length-j); 
      return lines; 
     } 
    }; 

    default : return function() { 
     var curr = arguments.callee.caller, 
      FUNC = 'function', ANON = "{anonymous}", 
      fnRE = /function\s*([\w\-$]+)?\s*\(/i, 
      stack = [],j=0, 
      fn,args,i; 

     while (curr) { 
      fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON; 
      args = stack.slice.call(curr.arguments); 
      i  = args.length; 

      while (i--) { 
       switch (typeof args[i]) { 
        case 'string' : args[i] = '"'+args[i].replace(/"/g,'\\"')+'"'; break; 
        case 'function': args[i] = FUNC; break; 
       } 
      } 

      stack[j++] = fn + '(' + args.join() + ')'; 
      curr = curr.caller; 
     } 

     return stack; 
    }; 
} 

})(); 
+0

¿Qué quiere decir "para el código del script en sí"? La llamada al código de seguimiento de la pila debe estar en la parte superior del seguimiento de la pila, pero debajo de eso está la persona que llama, ¿no? –

+0

Hola Jeremy, Ese puede ser el caso. Estoy mostrando el texto usando alerta(), pero el texto que obtengo termina en '...' así que tal vez es demasiado grande y el rastro real está justo debajo de esto. ¿Es posible eliminar la llamada 'función de rastreo' de la salida? – Gavin

Respuesta

12

Esta función getStackTrace() crea el seguimiento de pila de la función a la que llamó getStackTrace(). Hace no crea el rastro de pila de un error que ha atrapado. Por ejemplo, tendrá que utilizar para tratar de encontrar la manera de una función específica está siendo llamado:

function foo() { 
    // debug how this is being called 
    alert(YOUR_NAMESPACE.getStackTrace()); 
} 

o para añadir algo más de detalle a un error usted plantea:

function foo() { 
    // signal something went wrong 
    var error = new Error("error in foo"); 
    if (!error.stack) 
     error.stack = YOUR_NAMESPACE.getStackTrace(); 
    throw error; 
} 

Puede no utilizar de esta manera:

try { 
    foo(); 
} catch (e) { 
    alert(YOUR_NAMESPACE.getStackTrace(e)); 
} 

Aquí es un buen resumen de lo que apilar información que puede obtener - y de qué navegadores - cuando se produce un error: Three Painful Ways to Obtain a Stack Trace in Javascript (Enlace de Archive.org reemplazando el enlace inactivo)

+0

Gracias Justin, esto es lo que estaba buscando. El problema parece ser la forma en que lo llamaba. Muchas gracias. – Gavin

-1

Puede ser mejor que utilice el depurador incorporado de IE 8.

+0

Gracias por su sugerencia. Lamentablemente, estoy atrapado con IE7 (red corporativa y todo eso). – Gavin

+0

Incluso con IE7 puede activar la depuración de JavaScript en las opciones de Internet y ejecutar Visual Studio en caso de error. –

+0

Gracias por su sugerencia Mike. Desafortunadamente, debido a las mismas restricciones de red no puedo habilitar el depurador de Javascript en IE. – Gavin