我有一个网站突然开始让 Internet Explorer 崩溃。
该网站加载并开始执行 javascript,但其中某处机器爆炸了。我什至没有收到脚本错误,它只是崩溃了。我尝试使用内置调试器手动单步执行 js 的每一行,但当然问题不会发生。
如果我选择在应用程序崩溃时对其进行调试,我会看到以下消息。
iexplore.exe 中 0x6c5dedf5 处的未处理异常: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。叹