IE6 Hotfix MS-042将导致其Crash!
来源:互联网 发布:知行理工app官方 编辑:程序博客网 时间:2024/06/01 13:08
近来Test Team和部分Devs发现,在某些时候使用我们产品中的右键菜单会导致IE 6.0(sp1)直接Crash掉。从不同机器上IE不断Crash的情况来看,这应该可以确定是IE的问题,而不是偶然的机器环境导致的问题。虽然没有一个固定的步骤来准确复现这个问题,但是大家还是感觉到这是一个新近才集中出现的问题,因为我们产品中所使用的菜单控件创建于2004年11月30日,虽然后来有众多的修改,可是都没有改动及其基本的结构。
昨天我和同事在为这个Menu继续添加新功能时,发现这个Popup菜单导致IE Crash的问题变得十分频繁,几乎每做8,9步显示菜单的操作就能导致IE 6 Crash。
// 这样的问题真是让人无法忍受啊!!!
能搞出: The instruction at "0x4a5b19d6" referenced memory at "0x00000020". The memory could not be "red". 这样的问题,显然已经完全操出了脚本的能力。
原来引起这个问题的始作俑者居然是IE最近release的一个hotfix,该Hotfix 923762本来使用来解决IE非法退出的问题。可是没想到去鬼使神差的影响到了脚本生成Popup窗口的功能。
虽然没有固定的复现这个问题的步骤,但是下面这个页面还是很容易的在安装了该hotfix的IE上引发Crash:
进一步分析这个问题,再看看下面这两个改进的示例:
新的版本在反复点击"Show Popup Window"后不会Crash(至少我点了很久很久没有Crash...)。
仔细分析,我们可以发现,这个问题应该是IE内存泄露造成的。在第一个改进中,我们缓存了g_popup,反复点击其实只使用了一个popup窗口;而在第二个改进中,我们把从popup窗口内部元素对parent页面函数的引用去掉了。这样一来我们可以很容易的发现出错页面的原因:反复的生成并丢弃了对parent页面脚本元素有引用关系的popup窗口,就会使IE Crash掉。
那么大概知道了Crash的原因后,可以完全有效的避免这个Crash吗?我认为答案是否定的,因为使用Popup窗口来构成的菜单,不太可能绝对的不去引用Parent页面中的脚本方法,同时也很难有绝对安全的办法来避免产生野popup实例(没有被页面引用的popup,类似野指针概念)。退一万步,就算都避免了,那么这种cut过的popup还有什么实用意义呢?
除了自己小心,那么最有只能祈祷M$赶快推出新的补丁的补丁的补丁。。。
Reference: IE6 crashes after installing MS06-042
昨天我和同事在为这个Menu继续添加新功能时,发现这个Popup菜单导致IE Crash的问题变得十分频繁,几乎每做8,9步显示菜单的操作就能导致IE 6 Crash。
// 这样的问题真是让人无法忍受啊!!!
能搞出: The instruction at "0x4a5b19d6" referenced memory at "0x00000020". The memory could not be "red". 这样的问题,显然已经完全操出了脚本的能力。
原来引起这个问题的始作俑者居然是IE最近release的一个hotfix,该Hotfix 923762本来使用来解决IE非法退出的问题。可是没想到去鬼使神差的影响到了脚本生成Popup窗口的功能。
虽然没有固定的复现这个问题的步骤,但是下面这个页面还是很容易的在安装了该hotfix的IE上引发Crash:
<html>
<head>
<script language="javascript">
var g_popup = null;
function ShowPopup(elmt)
{
g_popup = window.createPopup();
var popBody = g_popup.document.body;
popBody.innerHTML = '<table style="text-align: center; height: 100%; border: dotted 1px blue">'
+ '<tr><td><button onclick="ShowPopup(this)">Show Popup Window</button><br><br>'
+ '蓝色虚线框中是一个Popup Window。</td></tr></table>';
g_popup.show(100, 100, 400, 200, elmt );
}
</script>
</head>
<body>
<button onclick="ShowPopup(this)">Show Popup Window</button>
</body>
</html>
// 保存为*.htm文件就可以了,打开后反复点击第一个"Show Popup Window",大概10次左右就会Crash。<head>
<script language="javascript">
var g_popup = null;
function ShowPopup(elmt)
{
g_popup = window.createPopup();
var popBody = g_popup.document.body;
popBody.innerHTML = '<table style="text-align: center; height: 100%; border: dotted 1px blue">'
+ '<tr><td><button onclick="ShowPopup(this)">Show Popup Window</button><br><br>'
+ '蓝色虚线框中是一个Popup Window。</td></tr></table>';
g_popup.show(100, 100, 400, 200, elmt );
}
</script>
</head>
<body>
<button onclick="ShowPopup(this)">Show Popup Window</button>
</body>
</html>
进一步分析这个问题,再看看下面这两个改进的示例:
<script language="javascript">
var g_popup = null;
function ShowPopup(elmt)
{
if ( !g_popup ) g_popup = window.createPopup();
var popBody = g_popup.document.body;
popBody.innerHTML = '<table style="text-align: center; height: 100%; border: dotted 1px blue">'
+ '<tr><td><button onclick="ShowPopup(this)">Show Popup Window</button><br><br>'
+ '蓝色虚线框中是一个Popup Window。</td></tr></table>';
g_popup.show(100, 100, 400, 200, elmt );
}
</script>
var g_popup = null;
function ShowPopup(elmt)
{
if ( !g_popup ) g_popup = window.createPopup();
var popBody = g_popup.document.body;
popBody.innerHTML = '<table style="text-align: center; height: 100%; border: dotted 1px blue">'
+ '<tr><td><button onclick="ShowPopup(this)">Show Popup Window</button><br><br>'
+ '蓝色虚线框中是一个Popup Window。</td></tr></table>';
g_popup.show(100, 100, 400, 200, elmt );
}
</script>
<script language="javascript">
var g_popup = null;
function ShowPopup(elmt)
{
g_popup = window.createPopup();
var popBody = g_popup.document.body;
popBody.innerHTML = '<table style="text-align: center; height: 100%; border: dotted 1px blue">'
+ '<tr><td>蓝色虚线框中是一个Popup Window。</td></tr></table>';
g_popup.show(100, 100, 400, 200, elmt );
}
</script>
var g_popup = null;
function ShowPopup(elmt)
{
g_popup = window.createPopup();
var popBody = g_popup.document.body;
popBody.innerHTML = '<table style="text-align: center; height: 100%; border: dotted 1px blue">'
+ '<tr><td>蓝色虚线框中是一个Popup Window。</td></tr></table>';
g_popup.show(100, 100, 400, 200, elmt );
}
</script>
新的版本在反复点击"Show Popup Window"后不会Crash(至少我点了很久很久没有Crash...)。
仔细分析,我们可以发现,这个问题应该是IE内存泄露造成的。在第一个改进中,我们缓存了g_popup,反复点击其实只使用了一个popup窗口;而在第二个改进中,我们把从popup窗口内部元素对parent页面函数的引用去掉了。这样一来我们可以很容易的发现出错页面的原因:反复的生成并丢弃了对parent页面脚本元素有引用关系的popup窗口,就会使IE Crash掉。
那么大概知道了Crash的原因后,可以完全有效的避免这个Crash吗?我认为答案是否定的,因为使用Popup窗口来构成的菜单,不太可能绝对的不去引用Parent页面中的脚本方法,同时也很难有绝对安全的办法来避免产生野popup实例(没有被页面引用的popup,类似野指针概念)。退一万步,就算都避免了,那么这种cut过的popup还有什么实用意义呢?
除了自己小心,那么最有只能祈祷M$赶快推出新的补丁的补丁的补丁。。。
Reference: IE6 crashes after installing MS06-042
- IE6 Hotfix MS-042将导致其Crash!
- hotfix
- Bug2108072导致Instance Crash
- uinavigationController pop 导致crash
- Latch导致MySQL Crash
- 误将SELINUXTYPE看成SELINUX后,将其值改为disabled。导致操作系统服务启动
- 链接libc.so导致crash
- implicit declaration 导致的crash
- RapidXML 导致的 crash 问题
- opencv中findContours导致crash
- Mysql:向信号量添加给定计数将导致其超出它的最大计数 错误
- 将指定的计数添加到该信号量中会导致其超过最大计数
- 将指定的计数添加到该信号量中会导致其超过最大计数
- 误将SELINUXTYPE看成SELINUX后,将其值改为disabled。导致操作系统服务启动,无法进入单用户模式
- IE6中“窗口正忙,关闭该窗口将导致一些问题,是否关闭该窗口”问题的解决
- 如何定位导致Crash的代码位置
- 如何定位导致Crash的代码位置
- Resize datafile导致ASM Crash一例
- IE6使用add方法添加optGroup的bug
- Visual studio .net已检测到指定的Web服务器运行的不是asp.net1.1版,您将无法运行asp.net Web应用程序或服务
- IE解析完全相同html代码的不同表现
- xml
- 怎样在Web开发中完美控制IE标题栏
- IE6 Hotfix MS-042将导致其Crash!
- 前世欠你的一滴泪
- IIS对于Web页中相对路径解析的问题
- 关于对cross-browser支持的一些看法
- 谈一谈支持cross-browser的解决方案
- asp.net
- SmartNavigation在Fx2.0中下岗了...
- 委托
- 关于DOM Explorer插件的功能和问题