我的网站总是崩溃 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
我无法调试/使我的应用程序崩溃。 OTOH Crashlytics iOS 为某些用户报告了一些现场崩溃:NSInvalidArgumentException