7

我有一个网站突然开始让 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。叹

4

5 回答 5

4

(老问题但很重要)

我遇到了一个非常相似的问题——包括许多复杂的 VML(来自 Raphael),而且看起来几乎无法调试。

实际上,事实证明,最简单的低技术方法是最好的。这是一种显而易见的方法:我写在这里是因为有时当面临一个令人生畏的问题时,显而易见、简单的解决方案是人们最后想到的。

因此,简单的老式调试:在我的代码中每次远程要求或复杂调用之前和之后进行大量alert("1");alert("2");,提供超级简单的可靠断点,不依赖任何可能会自行崩溃的功能(例如开发人员工具)。然后,只需查看在它崩溃之前您收到了哪个数字警报 - 问题必须出现在该警报和下一个警报之间。

添加更多警报,直到您将其缩小到确切的行。在我的例子中,它实际上与复杂的 VML 无关——它是一个 for 循环,出于某种原因,它只在 IE7 上无限地继续。

于 2012-12-17T23:01:25.077 回答
1

停止使用 VML?

如果您在 IE 中需要的东西确实无法通过移动、缩放、裁剪和替换图像来完成,那么请考虑使用 Flash、Silverlight 或类似工具。

如果您的生活依赖于 VML,那么请尽可能多地阅读其他人的经验,这可能会简化试错法。

于 2010-10-16T14:27:23.283 回答
1

它是一个空指针取消引用不可利用的崩溃

于 2013-05-12T05:49:01.037 回答
0

确保您的脚本在 DOMReady 事件发生后正在运行。IE 因在完全加载之前修改 DOM 时崩溃而臭名昭著。

在某些情况下,IE 可能会过早触发 DOMReady 事件。在此处此处查看有关如何克服此问题的更多信息。

于 2010-11-04T16:01:22.973 回答
0

您是否以任何形式使用 JSONP?像 jQuery 这样的流行实现倾向于通过在运行后从 DOM 中删除脚本节点来尝试清理内存。在许多情况下,我已经看到 Internet Explorer 崩溃。永远无法弄清楚需要什么其他条件才能导致崩溃。我的其他页面上发生了太多事情。

无论如何,如果您使用的是 jQuery.getJSON,请检查 jquery 源代码中的以下行:(jquery 1.4.3 上的第 5556 行):

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

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

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

您可以安全地删除它,或将其设置为仅在非 IE 浏览器中发生。希望这会有所帮助。

于 2010-11-05T19:29:21.580 回答