2010-10-16 15 views
7

Tengo un sitio web que de repente comenzó a fallar Internet Explorer.Mi sitio web sigue fallando IE, no se puede depurar

El sitio web carga y comienza a ejecutar javascript, pero en algún lugar allí la maquinaria explota. Ni siquiera recibo un error de script, simplemente falla. Intenté pasar manualmente todas las líneas de js con el depurador incorporado, pero luego, por supuesto, el problema no ocurre.

Si decido depurar la aplicación cuando se bloquea, veo el siguiente mensaje.

Excepción no controlada en 0x6c5dedf5 en iexplore.exe: 0xC0000005: infracción de acceso que lee la ubicación 0x00000090.

Los 5 elementos de la pila de llamadas es similar a esto

Vgx.dll! 6c5dedf5()
[Marcos a continuación pueden ser incorrectos y/o falta, no hay símbolos cargados para Vgx.dll]
vgx.dll! 6c594d70()
vgx.dll! 6c594f63()
vgx.dll! 6c595350()
vgx.dll! 6c58f5e3()
mshtml.dll! 6f88dd17()

VGX.dll parece ser parte del procesador de vml y de hecho estoy usando VML. No estoy sorprendido porque he tenido tantos problemas con vml, los atributos tienen que establecerse en un orden específico, a veces no puedes establecer atributos cuando tienes elementos conectados al dom o viceversa (todo por cierto no documentado) pero luego los problemas por lo general puede ser reproducido al depurar pero no ahora :(

El problema también se produce en ningún modo de plugin-

¿existe un método mejor que el ensayo y error para resolver este

Editar:.? Al agregar una consola que muestra todas las modificaciones sospechosas del DOM, el problema solo se produce a veces (la consola también implementado en JavaScript en la misma página, puedo ver la salida incluso después de un bloqueo ya que la ventana aún está visible) Aparentemente parece ser una especie de condición de carrera.

Logré rastrearlo aún más, y parece ocurrir cuando se quita un objeto del DOM demasiado rápido después de que se acaba de agregar. (lo más probable es que solo para elementos vml con algún atributo especial, no intenté más) y no se puede arreglar agregando un bucle muerto delante de removeChild (solución bastante mala de todos modos), la página debe ser renderizada por el navegador una vez después de addChild antes de que pueda llamar a removeChild. suspiro

+1

es broma - pero, bueno, usted podría ser capaz de elaborar una (otra) exploit para el IE de esta. Quiero decir que terminas leyendo desde alguna ubicación de memoria. Tal vez puedas lograr que esto haga algo realmente malo. Además, un Windows/IE totalmente parcheado y actualizado no debería colapsar desde ningún sitio web, sin importar qué tan incorrecto sea su código. Tal vez hay algún lugar para informar esto? – zerm

+1

Por favor envíeme una página de repro o URL; ¡Estoy feliz de echarle un vistazo! (ericlaw @ microsoft). ¡Gracias! – EricLaw

+0

FYI, la próxima vez configure su servidor de símbolos en el servidor de símbolos de Microsoft para obtener una mejor pila de llamadas: http://msdn.microsoft.com/en-us/library/b8ttk8zy%28v=vs.80%29.aspx –

Respuesta

1

¿Deja de usar VML?

Si necesita cosas en IE que realmente no se pueden hacer moviendo, escalando, recortando y reemplazando imágenes, entonces considere usar Flash, Silverlight o similar.

Si su vida depende de VML, entonces lea todo lo posible sobre la experiencia de otras personas, eso puede facilitar el enfoque de prueba y error.

0

Asegúrese de que sus scripts se estén ejecutando después de que ocurra el evento DOMReady. IE es notorio por fallas al modificar el DOM antes de que esté completamente cargado.

En algunos casos, IE puede desencadenar prematuramente el evento DOMReady. Vea más información sobre cómo superar esto here y here.

+0

Don No creo que sea por esto porque el problema puede ocurrir mucho después de que la página se haya cargado y por la interacción del usuario. Trataremos de verificar esto más ya que mi inicializador de carga es un poco complicado en este momento. –

0

¿Está utilizando JSONP de alguna forma? Las implementaciones populares como jQuery tienden a tratar de limpiar la memoria eliminando el nodo de script del DOM después de que se haya ejecutado. He visto que se bloquea Internet Explorer en muchos casos. Nunca pude descubrir qué otras condiciones necesitaban para causar que se bloquee. Demasiadas cosas sucediendo en mis otras páginas.

De todos modos, si usted está utilizando jQuery.getJSON, compruebe la siguiente línea en la fuente de jQuery: (línea 5556 en jQuery 1.4.3):

} else { 
    // Garbage collect 
    window[ jsonp ] = undefined; 

    try { 
    delete window[ jsonp ]; 
    } catch(jsonpError) {} 
} 

if (head) { 
    head.removeChild(script); 
} 

Se puede quitar con seguridad que, o condicionar lo solo ocurrirá en navegadores que no sean IE. Espero que eso ayude.

+0

No, no usa JSONP o jQuery en absoluto. –

4

(vieja pregunta, pero importante)

que tenía un problema muy similar - incluyendo un montón de VML compleja (de Rafael), y parecía casi imposible de depurar.

En realidad, resultó que el enfoque más simple de baja tecnología era el mejor. Es un enfoque obvio: escribo aquí porque a veces, cuando se enfrentan a un problema intimidante, las soluciones obvias y simples son las últimas en que una persona piensa.

Así, simple depuración de la vieja escuela: Porciones de alert("1");, etc alert("2"); antes y después de cada exigiendo de forma remota o llame al complejo en mi código, dando puntos de interrupción fiables súper simples que no se basan en ningún características (por ejemplo, herramientas de desarrollo) que ellos mismos podrían colapsar. Luego, solo vea qué alerta de número recibe antes de que se bloquee: el problema debe surgir entre esa alerta y la siguiente.

Agregue más alertas hasta que lo limite a la línea exacta. En mi caso, en realidad no tenía nada que ver con el complejo VML: era un bucle for que, por alguna razón, continuaba infinitamente solo en IE7.

+0

Sí. Estamos cegados por nuestras herramientas de lujo, pero muy a menudo las técnicas antiguas funcionan mejor. –

1

Su eliminar la referencia a un puntero nulo accidente no explotable

Cuestiones relacionadas