【发布时间】:2011-04-26 07:44:24
【问题描述】:
我有一个网站突然开始崩溃 Internet Explorer。
网站加载并开始执行 javascript,但其中某处机器爆炸。我什至没有收到脚本错误,它只是崩溃了。我尝试使用内置调试器手动单步执行 js 的每一行,但问题当然不会发生。
如果我选择在应用程序崩溃时对其进行调试,我会看到以下消息。
iexplore.exe 中 0x6c5ddf5 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000090。
调用堆栈中的前 5 项如下所示
VGX.dll!6c5dedf5()
[以下帧可能不正确和/或丢失,没有为 VGX.dll 加载符号]
VGX.dll!6c594d70()
VGX.dll!6c594f63()
VGX.dll!6c595350()
VGX.dll!6c58f5e3()
mshtml.dll!6f88dd17()
VGX.dll 似乎是 vml 渲染器的一部分,而我实际上正在使用 VML。我并不感到惊讶,因为我在使用 vml 时遇到了很多问题,必须按特定顺序设置属性,有时当您将元素附加到 dom 时,您无法设置属性,反之亦然(顺便说一句,所有内容均未记录),但随后出现了问题调试时通常可以重现,但现在不行:(
在无插件模式下也会出现此问题。
有没有比试错法更好的方法来解决这个问题?
编辑: 添加一个控制台输出对 DOM 的每个可疑修改使得问题仅在有时发生。 (控制台也在同一页面上的 javascript 中实现,即使在崩溃后我也能看到输出,因为窗口仍然可见)显然它似乎是某种竞争条件。
我设法进一步追踪它,当您在刚添加对象后过快地从 DOM 中删除对象时,似乎会发生这种情况。 (很可能仅适用于具有某些特殊属性的 vml 元素,没有进一步尝试)并且无法通过在 removeChild 前面添加死循环来修复它(无论如何都是非常糟糕的解决方案),页面必须由浏览器在addChild 之后一次就可以调用removeChild。叹息
【问题讨论】:
-
开个玩笑——但是,好吧,您也许可以从中为 IE 设计一个(其他)漏洞利用。我的意思是你最终会从一些内存位置读取。也许你可以让它做一些非常糟糕的事情。此外,无论您的代码有多么错误,一个完全修补和最新的 windows/IE 都不应该从任何网站崩溃。也许有什么地方可以报告这个?
-
请给我一个复制页面或 URL;我很高兴看看! (埃里克劳@微软)。谢谢!
-
仅供参考,下次将您的符号服务器设置为 Microsoft 符号服务器以获得更好的调用堆栈:msdn.microsoft.com/en-us/library/b8ttk8zy%28v=vs.80%29.aspx
标签: javascript internet-explorer debugging crash vml