我的网站总是崩溃 IE,无法调试

Posted

技术标签:

【中文标题】我的网站总是崩溃 IE,无法调试【英文标题】:My website keeps crashing IE, can't debug 【发布时间】: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 【参考方案1】:

(老问题但很重要)

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

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

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

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

【讨论】:

是的。我们被花哨的工具蒙蔽了双眼,但通常旧的技术效果更好。【参考方案2】:

停止使用 VML?

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

不要认为是因为这个问题,因为问题可能在页面加载后很长时间以及通过用户交互发生。将尝试更多地检查这一点,因为我的 onload 初始化程序现在有点破解。【参考方案5】:

您是否以任何形式使用 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 浏览器中发生。 希望这会有所帮助。

【讨论】:

不,根本不使用 JSONP 或 jQuery。

以上是关于我的网站总是崩溃 IE,无法调试的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11 调试器在断点处崩溃,找不到 Foundation.h

如何调试网站的 IE8 客户端问题?

我无法调试/使我的应用程序崩溃。 OTOH Crashlytics iOS 为某些用户报告了一些现场崩溃:NSInvalidArgumentException

在客户环境中调试崩溃的后续步骤

visual studio2005中怎么更改调试的默认浏览器?总是调试出错!

程序在调试模式下崩溃:“无法解散”?