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。

    IE-MS042-Crash.png
    // 这样的问题真是让人无法忍受啊!!!

    能搞出: 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(
100100400200, elmt );
    }

    
</script>
</head>
<body>
    
<button onclick="ShowPopup(this)">Show Popup Window</button>
</body>
</html>
    // 保存为*.htm文件就可以了,打开后反复点击第一个"Show Popup Window",大概10次左右就会Crash。

    进一步分析这个问题,再看看下面这两个改进的示例:
<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(
100100400200, 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(
100100400200, 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
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没写欠条的债该怎么办 被尾随回家知道住处怎么办 微信记录全没了怎么办 微信记录没有了怎么办 ipad登录不了下不了软件怎么办 苹果手机打开自动时间不对怎么办 魅族手机时间不同步怎么办 小米手环时间不准怎么办 电脑网络dns配置错误怎么办 去泰国手机要打电话怎么办 苹果6s音量小怎么办 三星0n7充电慢怎么办 在国外接受不到验证码怎么办 ip地址错误网络无法连通怎么办 注册微信收不到验证码怎么办 安卓手机收不到短信怎么办 手机被短信验证码轰炸怎么办 美国访学一年手机卡怎么办方便 小狗吃了葡萄皮怎么办 ios迅雷下载不了的资源怎么办 ipad软件商店内容少怎么办? 脸摔伤后留下黑印怎么办 不确定孩子是不是老公的怎么办 孩子接种证丢了怎么办 孩子的出生证丢了怎么办 私秘边上肿了怎么办 书法作品少写一个字怎么办 炉石传说ios闪退怎么办 ck手表表链大了怎么办 天梭手表卡扣坏了怎么办 机械表平时不戴怎么办 天梭机械表慢了怎么办 手表每天慢10秒怎么办 浪琴机械表不走了怎么办 大提单号被修改了怎么办 入户中山没有三年居住证明怎么办 加拼关单号舱单信息没有怎么办 外贸中交货期晚了怎么办 履约保函到期了怎么办 续贷高校未通过怎么办 安卓手机网速慢怎么办