近来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:

<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。

进一步分析这个问题,再看看下面这两个改进的示例:

<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>
<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>

新的版本在反复点击"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!相关推荐

  1. 解决JDBC-ODBC驱动桥导致JVM crash.

    最近帮一个朋友做了一个网站,开始因考虑到访问量不算太高,采用了ACCESS作为数据库,采用了JDBC-ODBC驱动桥接方式.写到配置文件中加载到内存,供系统运行时使用. <dbconfig> ...

  2. 反汇编程序导致程序crash的解决思路

    曾经发现win7下程序基地址不停地变动,又发现下移代码会导致程序crash,一度怀疑win7系统或者vs编译器是不是做了什么校验机制,专门针对数据逆向者,限制反汇编修改代码,打断了我学习外挂编写的信心 ...

  3. 关于CALayer导致的crash问题

    push到一个页面进行绘图时,设置如下: CALayer * layer = [CALayer layer]; layer.frame = CGRectMake(0, 0, 300, 300); la ...

  4. IE6下载文件名过长导致乱码问题的解决方案

    String fileName = "IE6下载文件名过长导致乱码问题的解决方案.doc"; Encoding code = Encoding.GetEncoding(" ...

  5. 【Android】【问题分析】G-sensor因数据交互问题导致手机crash

    G-sensor因数据交互问题导致手机crash 问题现象: 测试同事发现,手机在使用和待机时,低概率发现手机会crash 问题原因: G-sensor在driver和HAL层因交互的参数不匹配,导致 ...

  6. C++的异常机制导致的crash问题

    问题背景 最近工作中遇到了一个非常奇怪的crash问题,反反复复分析了好久.由于保密原因,这里只记录一下分析思路,不会涉及到代码. 初步log分析 tombstone显示这是一个abort:Cmdli ...

  7. mysql批量insert bug_MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash...

    1. 背景 业务执行 SQL 导致 MySQL 进程 Crash,做故障切换后,新的主库又 Crash 了.查看 MySQL 错误日志,发现多次 Crash 时的堆栈相同,如下: Thread poi ...

  8. mysqldump死住(实际是导致mysqld crash)

    在MySQL 5.0.16上,用mysqldump导出数据,mysqldump半天没反应. 操作系统是RHEL4.0. 看日志 *** glibc detected *** free(): inval ...

  9. ios开发遇到的memory持续上涨导致页面crash解决思路总结

    我在IOS遇到过的闪退主要分为程序启动完Lanch page在初始化页面就崩溃,和在程序运行中crash两种: 后者我遇到的情况是memory占用过多,被系统kill掉了一部分正在占用的内存,导致程序 ...

最新文章

  1. Windows下Redis中RedisQFork位置调整
  2. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(3)--- 服务访问和配置模式...
  3. Java知识点总结(JDBC-封装JDBC)
  4. Python 获 Mozilla 和扎克伯格夫妇 40 余万美金资助
  5. 16位汇编 call调用函数 通过栈来传递参数
  6. Mac的最小化和隐藏的区别
  7. SpringBoot入门_搭建及配置环境(eclipse || Spring ToolS)
  8. python第二十八课——编码小常识
  9. 【iVX 初级工程师培训教程 10篇文拿证】04 画布及我和 iVX 合照
  10. PDF文件如何转成markdown格式 1
  11. 怎样从外网访问自己的HTTP服务器
  12. android assets目录在哪,Android Studio 中 assets目录的使用
  13. 《精益数据分析》:网易创始人丁磊力荐
  14. 轻松一下:python(turtle模块)绘制分形图
  15. win10安装Mingw,看这里!
  16. 子元素自动撑开父元素空间
  17. python成语接龙到为所欲为_python成语接龙
  18. 倾斜摄影顶点XYZ转世界坐标系再转BLH
  19. 4.1 用学会学习破解迷茫——《逆袭大学》连载
  20. 数据类型整理(笼统)

热门文章

  1. windows主机的linux虚拟机中使用neovim复制、粘贴
  2. 行业报告:医疗数据泄露愈发严重,谁之过错?
  3. 软件项目可持续性运作地思考
  4. Java时间类之间的转换案例——计算自己活了多少天
  5. javascript版购物网站图片轮转
  6. 虚拟桌面之往事如风 --读书篇
  7. ADMT3.1快速迁移域用户账户和组[为企业维护windows server 2008系列十四]
  8. ADO.NET Entity Framework支持多Provider
  9. FCKEditor 验证为空需要点击两次提交按钮的问题
  10. MySQL性能优化 分区