2010-10-16 9 views
7

Ich habe eine Website, die plötzlich begann Internet Explorer zu crashen.Meine Website stürzt IE ab, kann nicht debuggen

Die Website lädt und startet JavaScript, aber irgendwo dort explodiert die Maschinerie. Ich bekomme nicht einmal einen Skriptfehler, es stürzt einfach ab. Ich habe versucht, jede einzelne Zeile von js mit dem integrierten Debugger manuell zu durchlaufen, aber dann tritt das Problem natürlich nicht auf.

Wenn ich entscheide, die Anwendung zu debuggen, wenn es abstürzt, sehe ich die folgende Nachricht.

Nicht behandelte Ausnahme bei 0x6c5dedf5 in iexplore.exe: 0xC0000005: Zugriffsverletzungsleseposition 0x00000090.

Die Top-5-Elemente in der Call-Stack wie folgt aussieht

Vgx.dll! 6c5dedf5()
[Frames unten sein kann fehlerhafte und/oder fehlen, für Vgx.dll geladen Symbole]
Vgx.dll! 6c594d70()
Vgx.dll! 6c594f63()
Vgx.dll! 6c595350()
Vgx.dll! 6c58f5e3()
mshtml.dll! 6f88dd17()

VGX.dll scheint Teil des vml Renderers zu sein, und ich benutze tatsächlich VML. Ich bin nicht überrascht, weil ich so viele Probleme mit Vml hatte, Attribute müssen in einer bestimmten Reihenfolge gesetzt werden, manchmal können Sie keine Attribute setzen, wenn Sie Elemente an das Dom angehängt haben oder umgekehrt (alles undokumentiert BTW), aber dann die Probleme kann in der Regel reproduziert werden, wenn aber nicht jetzt

Das Problem tritt auch in keinem Plugin-Modus :(

Debuggen

gibt es einen besseren Ansatz als Versuch und Irrtum diese

bearbeiten zu lösen.? Das Hinzufügen einer Konsole, die jede verdächtige Änderung an das DOM ausgibt, hat das Problem nur manchmal verursacht in Javascript auf der gleichen Seite implementiert, ich bin in der Lage, die Ausgabe auch nach einem Absturz zu sehen, da das Fenster noch sichtbar ist) Anscheinend scheint es eine Art Race Condition zu sein.

Es ist mir gelungen, es noch weiter zu verfolgen, und es scheint zu vorkommen, wenn Sie ein Objekt aus dem DOM zu schnell entfernen, nachdem es gerade hinzugefügt wurde. (höchstwahrscheinlich nur für vml-elemente mit einigen speziellen attributen, habe es nicht weiter versucht) Und es kann nicht behoben werden, indem man eine dead loop vor removeChild hinzufügt (ziemlich schlechte lösung sowieso), die seite muss von der gerendert werden Browser einmal nach dem AddChild, bevor Sie RemoveChild aufrufen können. seufzen

+1

Nur ein Scherz - aber, na ja, können Sie möglicherweise eine (andere) fertigen Exploit für IE von diesem. Ich meine, du liest am Ende aus irgendeinem Speicherort. Vielleicht kannst du das dazu bringen, etwas wirklich Schlimmes zu tun. Außerdem sollte ein vollständig gepatchtes und aktuelles Windows/IE von keiner Website abstürzen, egal wie falsch der Code ist. Vielleicht gibt es einen Ort, um dies zu melden? – zerm

+1

Bitte senden Sie mir eine Repro-Seite oder URL; Ich freue mich, einen Blick darauf zu werfen! (ericlaw @ Microsoft). Vielen Dank! – EricLaw

+0

FYI, das nächste Mal setzen Sie Ihren Symbol-Server auf den Microsoft Symbol Server, um einen besseren Aufruf-Stack zu erhalten: http://msdn.microsoft.com/en-us/library/b8ttk8zy%28v=vs.80%29.aspx –

Antwort

1

Stop mit VML?

Wenn Sie Dinge im IE benötigen, die wirklich nicht durch Verschieben, Skalieren, Zuschneiden und Ersetzen von Bildern erledigt werden können, dann sollten Sie Flash, Silverlight oder ähnliches verwenden.

Wenn Ihr Leben von VML abhängt, dann lesen Sie so viel wie möglich über andere Menschen Erfahrung, die den Versuch und Irrtum Ansatz erleichtern können.

0

Stellen Sie sicher, dass Ihre Skripts nach dem DOMReady-Ereignis ausgeführt werden. Der IE ist dafür bekannt, dass er abstürzt, wenn er das DOM modifiziert, bevor es vollständig geladen ist.

In einigen Fällen kann IE das DOMReady-Ereignis vorzeitig auslösen. Weitere Informationen dazu finden Sie unter here und here.

+0

Don Ich denke, das liegt daran, dass das Problem lange nach dem Laden der Seite und durch Benutzerinteraktion auftreten kann. Ich werde versuchen, das noch genauer zu überprüfen, da mein Onload-Initialisierer gerade ein bisschen ein Hack ist. –

0

Verwenden Sie JSONP in irgendeiner Form? Bei gängigen Implementierungen wie jQuery wird versucht, Speicher zu bereinigen, indem der Skriptknoten nach dem Ausführen aus dem DOM gelöscht wird. Ich habe den Internet Explorer in vielen Fällen zum Absturz gebracht. Konnte nie herausfinden, welche anderen Bedingungen nötig waren, um das zum Absturz zu bringen. Auf meinen anderen Seiten passiert zu viel.

Wie auch immer, wenn Sie jQuery.getJSON verwenden, überprüfen Sie die folgende Zeile in jquery Quelle: (Linie 5556 auf jquery 1.4.3):

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

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

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

Sie können das sicher entfernen, oder es konditionalisieren nur in Nicht-IE-Browsern passieren. Hoffentlich hilft das.

+0

Nein, JSONP oder jQuery überhaupt nicht verwenden. –

4

(alte Frage, aber wichtig)

hatte ich ein sehr ähnliches Problem - darunter viele komplexe VML (von Raphael), und es sah nahezu unmöglich zu debuggen.

Eigentlich stellte sich heraus, dass der einfachste Low-Tech-Ansatz der Beste war. Es ist ein offensichtlicher Ansatz: Ich schreibe hier, weil manchmal, wenn man mit einem einschüchternden Problem konfrontiert wird, die offensichtlichen, einfachen Lösungen die letzte sind, an die man denkt.

So einfach old-school-Debugging: Viele alert("1");, alert("2"); usw. vor und nach jedem der Ferne in meinem Code oder komplexen Anruf anspruchsvollen, was super-einfache zuverlässige Haltepunkte, die auf all Funktionen stützen sie nicht (zB Entwickler-Tools) das könnte selbst ausbrechen. Dann sehen Sie sich einfach an, zu welcher Nummer Sie vor dem Absturz gelangen - das Problem muss zwischen dieser Warnung und der nächsten auftreten.

Fügen Sie weitere Warnungen hinzu, bis Sie sie auf die genaue Linie eingrenzen. In meinem Fall hatte es eigentlich nichts mit der komplexen VML zu tun - es war eine for-Schleife, die aus irgendeinem Grund nur auf IE7 unendlich weiterging.

+0

Yup. Wir werden von unseren raffinierten Werkzeugen geblendet, aber oft funktionieren die alten Techniken besser. –

1

Es ist ein Null-Pointer-Dereference nicht ausnutzbar Absturz