J'ai un site Web qui a soudainement commencé à cracer Internet Explorer. P>
Le site Web charge et commence à exécuter JavaScript mais quelque part là-bas, les machines explosent. Je n'ai même pas d'erreur de script, il se bloque simplement. J'ai essayé de participer manuellement à chaque ligne de JS avec le débogueur intégré, mais bien sûr, le problème ne se produit pas. P>
Si je choisis de déboguer la demande lorsqu'il se bloque, je vois le message suivant. P>
Exception non gérée à 0x6C5EDEDF5 dans iExplore.exe: 0xc0000005: Accès Lecture de violation Emplacement 0x00000090. P>
Les 5 meilleurs éléments de la pile d'appels ressemblent à ceci p>
vgx.dll! 6c5dedf5 ()
[Les cadres ci-dessous peuvent être incorrects et / ou manquants, aucun symbole chargé pour vgx.dll]
Vgx.dll! 6c594d70 ()
Vgx.dll! 6c594f63 ()
Vgx.dll! 6c595350 ()
Vgx.dll! 6c58f5e3 ()
mshtml.dll! 6f88dd17 () P> blockQuote>vgx.dll semble faire partie du VML Renderer et je suis en fait en utilisant VML. Je ne suis pas surpris parce que j'ai eu tellement de problèmes avec VML, les attributs doivent être définis dans une commande spécifique, parfois, vous ne pouvez pas définir des attributs lorsque vous avez des éléments attachés à la DOM ou inversement (tout ce qui est non documenté BTW), mais alors les problèmes peut généralement être reproduit lors du débogage mais pas maintenant: ( p>
Le problème ne se produit pas non plus dans aucun mode de plugin. P>
Y a-t-il une meilleure approche que l'essai et l'erreur pour résoudre ce problème? P>
EDIT: strong> L'ajout d'une console délivrant chaque modification suspecte au DOM a fait que le problème ne se produise que parfois. (La console est également implémentée dans JavaScript sur la même page, je suis capable de voir la sortie même après un crash car la fenêtre est toujours visible) apparemment, il semble être une sorte de condition de race. P>
J'ai réussi à le suivre encore plus loin, et il semble se produire lorsque vous supprimez un objet de la DOM trop rapidement après que cela vient d'être ajouté. (Très probablement uniquement pour les éléments VML avec un attribut spécial, n'a pas essayé davantage) et il ne peut pas être corrigé en ajoutant une boucle morte devant le removechild (toute mauvaise solution de toute façon), la page doit être rendue par le Navigateur une fois après l'addChild avant de pouvoir appeler Removechild. Soupir p>
5 Réponses :
Arrêtez d'utiliser VML? P>
Si vous avez besoin de choses dans IE, cela ne peut vraiment pas être fait en déplaçant, à la mise à l'échelle, à la recadrage et en remplaçant des images, puis envisagez d'utiliser Flash, Silverlight ou similaire. P>
Si votre vie dépend de VML, lisez autant que possible sur l'expérience des autres peuples, cela peut faciliter l'approche d'essai et d'erreur. P>
Assurez-vous que vos scripts fonctionnent après que l'événement Domready se produise. Ie est notoire pour le crash lors de la modification du DOM avant qu'il ne soit complètement chargé. P>
Dans certains cas, c'est-à-dire que cela pourrait tirer prématurément l'événement domready. Voir plus d'informations sur la façon de surmonter ce ici et ici . p>
Ne pensez pas que c'est à cause de cela, car le problème peut se produire longtemps après la charge de la page et par interaction utilisateur. J'essaierai de vérifier cela plus si mon initialiseur de surcharge est un peu un piratage en ce moment.
Utilisez-vous JSONP sous quelque forme que ce soit? Des implémentations populaires comme JQuery ont tendance à essayer de nettoyer la mémoire en supprimant le nœud de script à partir du DOM après son exécution. J'ai vu cet ébauche Internet Explorer dans de nombreux cas. Ne pouvait jamais comprendre quelles autres conditions devaient être autour de cela pour causer un crash. Trop de choses qui se rendent dans mes autres pages.
De toute façon, si vous utilisez jquery.getjson, vérifiez la ligne suivante à JQuery Source: (Ligne 5556 sur jQuery 1.4.3): P>
} else { // Garbage collect window[ jsonp ] = undefined; try { delete window[ jsonp ]; } catch( jsonpError ) {} } if ( head ) { head.removeChild( script ); }
Nope, pas utiliser JSON ou JQUERY du tout.
(ancienne question mais importante) p>
J'ai eu un problème très similaire - y compris beaucoup de VML complexe (de Raphael), et il avait l'air presque impossible à déboguer. P>
En fait, il s'est avéré que l'approche la plus simple à la bonne technologie était la meilleure. C'est une approche évidente: j'écris ici parce que parfois, face à un problème intimidant, les solutions simples et simples sont la dernière une personne qui pense. P>
Donc, simple de débogage de la vieille école: beaucoup d'alerte Ajoutez plus d'alertes jusqu'à ce que vous restiez à la ligne exacte. Dans mon cas, ce n'était rien à voir avec le complexe VML - c'était une boucle pour que, car une raison quelconque se poursuivait infiniment uniquement sur IE7. P> ("1"); code>,
alerte ("2"); code> et et après chaque exigeante à distance ou Appel complexe dans mon code, donnant des points d'arrêt fiables ultra-simples qui ne reposent pas sur des caractéristiques (par exemple, des outils de développeurs) qui pourraient elles-mêmes s'écraser. Ensuite, voyez simplement quelle numéro d'alerte vous arrivez avant de ne pas se bloquer - le problème doit survenir entre cette alerte et la suivante. p>
Ouais. Nous sommes aveugles par nos outils de fantaisie, mais très souvent, les anciennes techniques fonctionnent mieux.
C'est un crash non exploitable de Dréréférence de pointeur nulle Dréréférence P>
Je plaisante - mais, eh bien, vous pourrez peut-être créer un (autre) exploit à coire à partir de cela. Je veux dire que vous finissez par lire à partir d'un emplacement de mémoire hors mémoire. Peut-être que vous pouvez obtenir cela pour faire quelque chose de vraiment mauvais. En outre, une fenêtre entièrement patchée et mise à jour / c.-àchique ne devrait pas se bloquer d'un site Web, peu importe la vitesse de votre code. Peut-être qu'il y a un endroit pour signaler cela?
S'il vous plaît envoyez-moi une page de reproduction ou une URL; Je suis heureux d'avoir un look! (Ericlaw @ Microsoft). Merci!
FYI, la prochaine fois définit votre serveur de symboles sur le serveur de symboles Microsoft pour obtenir une meilleure pile d'appel: msdn.microsoft.com/en-us/library/b8ttk8zy%28v=vs.80%29.aspx