8

Necesito obtener una pila de llamadas completa cuando ocurre una excepción en JavaScript en Internet Explorer 8. Las llamadas de función pueden ocurrir entre tramas cuyo número es grande.Pila de llamadas completa para varias tramas JS en IE8

Pila de llamadas necesaria para enviar registros a los desarrolladores. No puedo usar un depurador, porque el usuario final no tiene que lidiar con este problema.

La solución actual para JavaScripts siempre que pueda generar callstack (http://eriwen.com/javascript/js-stack-trace/). Se basa en arguments.callee.caller. Pero el llamador devuelve cero (indefinido) si se llamó a la función desde fuera del cuadro actual. Por lo tanto, callstack obtenido es incompleto.

¿Puedo obtener el nombre de un marco desde el cual se llamó a la función en este caso?

solución basada en la tecnología de secuencias de comandos activas da un objeto de tipo ScriptEngine: IHTMLDocument :: get_Script (IDispatch ** p)

Pero el objeto de colado "guión" de la interfaz falla IActiveScript.

* ¿Puedo obtener de IE8 el enlace que se utilizará para un contexto determinado ScriptEngine, para extraer la información necesaria para construir el callstack?

+0

Por supuesto, espero se obtiene una buena respuesta a esta y publicar algo a la comunidad, lo necesitamos! FYI, js-stack-trace también dará un rastro erróneo de la pila si alguna de las funciones de la pila se llama más de una vez porque "el valor del atributo de llamante es una función, no un marco de pila, por lo que la parte inferior del rastro de la pila faltará si alguna función se llama recursivamente ". (http://blog.yoursway.com/2009/07/3-painful-ways-to-obtain-stack-trace-in.html) – Hemlock

+0

Gracias, Hemlock. Aquí se ofrece más explicación para la interacción de Internet Explorer y Java Script Engine: http://blogs.msdn.com/b/jaiprakash/archive/2007/01/22/jscript-exceptions-not-handled-thrown- across-frames-if-throwwn-from-a-expando-method.aspx pero esto no resuelve el problema :( – RostislavS

+2

Evitar la comunicación entre fotogramas sería la solución más fácil. – Raynos

Respuesta

2

He encontrado alguna manera, que puede ser útil. Utiliza la idea de devolución de llamada.

Definir siguiente función simple en cada cuadro:

function getCaller() { return arguments.callee.caller; } 

y siguientes funciones solamente para la parte superior del marco:

function populateStack(fn) { 
    var perFrames = []; 
    for (var i = 0; i < windows.length; i++) { 
     var win = windows[i]; 
     var func = (win == this) ? fn : win.getCaller(); 
     var localStack = []; 
     while (func) { 
      localStack.push(getFuncName(func)); 
      func = func.caller; 
     } 
     perFrames.push(getWinName(win) + ": " + localStack.join(", ")); 
    } 
    alert(perFrames.join("\n")); 
} 

function getWinName(win) { 
    var m = win.location.toString().match(/^.*\/(.*)$/); 
    return m[1]; 
} 

function getFuncName(func) { 
    var m = func.toString().match(/^function\s*(\w*)\(/); 
    return m[1] || "anonymous"; 
} 

ventanas deben ser una matriz en la parte superior del marco que contiene todos los objetos de la ventana (es decir, los marcos) Uso:

window.top.populateStack.call(window, arguments.callee); 

He pasado un par de horas, tratando de restablecer el orden exacto en el que se denominan funciones, pero no he encontrado ninguna solución. Solo el orden parcial (las funciones se ordenan correctamente dentro de los marcos) está disponible en ese código.

Si tiene varios servidores con diferentes versiones de código, entonces puede agregar un código, que analizará los cuerpos de funciones y obtendrá más información sobre el orden de las llamadas.

Esperanza, esto ayuda :-)

+0

Gracias, kirilloid.Tal vez sea la única solución para este momento. – RostislavS

+0

Error interesante en IE8: [excepciones de JScript no manejadas/lanzadas a través de marcos si se lanzan desde un método de expansión] (http://blogs.msdn.com/b/jaiprakash/archive/2007/01/22/jscript-exceptions-not -handled-thrown-across-frames-if-throwwn-from-a-expando-method.aspx). Este artículo cuestiona la eficacia del sistema de excepciones en IE8 (en IE9.b parece ser fijo) – RostislavS

Cuestiones relacionadas