如何更改我的IE扩展以解决另一个模块(flash.ocx)崩溃IE中的访问冲突?

时间:2015-02-05 15:07:54

标签: .net internet-explorer flash bho ieaddon

我有一个Internet Explorer扩展程序(一个BHO)可以很好地在数千台计算机上运行,​​但在某些情况下似乎会导致Flash因访问冲突而使iexplore.exe崩溃。我可以尝试做些什么来避免这种冲突?

更多详情:

在一个客户的环境中,我们遇到这样的情况,即在使用Flash访问网站并关闭IE选项卡后,标签进程崩溃。只有在Flash和我的扩展程序都启用且目前在该公司环境之外的工作站上无法复制时,才会出现这种情况。如果我的扩展程序配置为在该页面上什么都不做 - 它仍然会发生 - 即我的一些代码仍然执行但很少。

如果网站不在受信任的站点中,则该选项卡在保护模式下运行,崩溃的结果是一个窗口,表示网页要运行dw20.exe(即Watson博士){{0} }。

如果网站被添加到可信站点,则会向Windows应用程序事件日志写入错误,IE会重新打开选项卡,并显示一条小信息栏消息,说明IE已从崩溃中恢复。无论哪种方式令人沮丧!用户真的不在乎当关闭选项卡时进程崩溃,因此我对解决方法感到满意,这意味着没有向用户显示错误消息,并且选项卡不会重新打开。

Windows应用程序事件日志并没有多说,但确实说iexplore.exe进程崩溃了错误的模块flash:

Error / Application Error / EventID=1000

Faulting application name: iexplore.exe, version 9.0.8112.16592, time stamp 0x544e95a7
Faulting module name: Flash32_13_0_0_214.ocx, version 13.0.0.214, time stamp 0x5359c422
Exception code: 0xc0000005
Fault offset: 0x00073678
Faulting application start time: 0x01d0099db319df49
Faulting application path: C:\Program Files\Internet Explorer\iexplore.exe
Faulting module path: C:\Windows\system32\Macromed\Flash\Flash32_13_0_0_214.ocx
ReportId: 0094988b-7591-11e4-93e6-6cf0492a8610

这是一个相当新版本的闪存,但不是最新版本。他们尝试升级到最新版本,但症状相同。

他们的工作站运行Sophos防病毒软件,在极少数情况下,我们看到防病毒软件导致我们的扩展程序出现问题。我们在停止提到Sophos的所有Windows服务并且发生了同样的问题之后进行了测试,因此我确实确定确定它与此无关。

我的扩展程序是使用.NET 3.5 SP1构建的,由于与其他扩展程序存在潜在的运行时冲突,因此这不是一种理想的方法,但这就是现在的情况。

如果我禁用扩展程序,问题就会消失。如果我禁用Flash,问题就会消失。故障模块Flash32_13_0_0_214.ocx强烈指出它是一个错误,但我认为理论上它可能是我的代码中的一个问题。我的扩展程序中没有执行任何非托管代码,因此它无法实现,因此我无法想到我的扩展程序可能会导致AccessViolation的任何操作。这样就可能出现Flash中的错误,这似乎完全有可能,或者是我与IE的COM对象交互方式的问题。但是,除非我能指出具体且可复制的内容,否则Flash团队不太可能会调查此类错误报告,而且现在我无法在任何开发机器上复制,因此不是很好。即使它是一个Flash错误,从客户的角度来看,与我的产品中的错误没有什么不同:要么我修复了它,要么我的产品将被卸载并且他们&#39 ;保持Flash。

选项

我所希望的是一些关于:

的想法
  • 我的代码/产品中是否有可以尝试避免与Flash冲突的内容?例如,将我的dll重新定位以将我的扩展移动到不同的内存区域有任何希望工作吗?重新编译.NET 4.0 / 4.5是否有机会工作?

  • 我可以做些什么来复制这个问题...为什么这不会成为其他几十家公司的问题但在这个问题上会出现问题?关于可能导致问题的环境因素的任何想法,但不是在工作站上设置的不同?

  • 是否有任何意图尝试获取崩溃转储或其他有关崩溃的诊断信息(例如崩溃时的ProcMon)?我没有专业知识可以通过这样的诊断,所以我想避免它,除非它可能引导我回答我在产品中可能采取的不同做法或找出确切的错误在闪存模块中(如果确实存在)。

  • 我很高兴有一种方法让它无声地崩溃,所以例如阻止IE崩溃时重新打开标签的东西。

我可能需要一段时间才能与客户一起测试不同的选项,所以我想尝试一些事情。任何想法都非常感激。

到目前为止,我已经有了一些随意的想法。其中任何一个听起来都值得一试

  • 使用.net 4重新编译
  • 在我的SetSite(null)方法中(卸载我的扩展时发生的事件)我有几行清理代码,如Marshal.FinalReleaseComObject(webBrowser)GC.Collect()。删除其中一个或多个:可能GC或COM清理混乱了Flash的内存空间。
  • 改变我的d ..
  • 在工作站上卸载并重新安装IE9,看看是否有任何影响。这不是一个可以在整个公司范围内运行的解决方案,但可能表明他们的IE图像有些狡猾。

更新

客户再次复制问题而不是Flash ocx,故障模块为jscript9.dll。他们还报告了与ntdll.dll相同的情况,尽管我自己也没有看到过。

Faulting application name: iexplore.exe, version: 9.0.8112.16575, time stamp: 0x53ee1acb 
Faulting module name: jscript9.dll, version: 9.0.8112.16575, time stamp: 0x53ee1c49 
Exception code: 0xc0000005 
Fault offset: 0x00007264 
Faulting process id: 0x1bb4 
Faulting application start time: 0x01cfec57f247cb53 
Faulting application path: C:\Program Files\Internet Explorer\iexplore.exe 
Faulting module path: C:\Windows\System32\jscript9.dll 
Report Id: 50b58f63-584b-11e4-bc66-6cf0492a8610 
Faulting package full name: %14 
Faulting package-relative application ID: %15

所以我想这可以打开它与Flash无关......

1 个答案:

答案 0 :(得分:3)

问题是,使用.Net,你几乎什么都不能积极地弄乱内存。所以,除非你在Api通话中玩很多,但是你的代码中的某些东西真的很难导致错误。

重新定位dll在我看来是最有希望做的事情;也没有搞乱海湾合作委员会,这似乎是一个非常好的选择(而且总是这样,不仅仅是在这种情况下)。

另一个问题是,你的模块不是故障,这是值得认真考虑的事情:不是你的代码试图通过另一个人来到某个内存区域。 dll,但是他们的代码试图弄乱你的dll的内存空间。

可能你最好的选择是DW;通过让它保存转储,您可以通过堆栈跟踪来查找导致问题的代码。再次回溯,你可以找到一些参数变成垃圾的时刻。最后,您可以使用此https://msdn.microsoft.com/en-us/windows/hardware/hh852365实时调试崩溃。为什么这一切?好吧,因为如果你没有在你的dll中做任何奇怪的事情(比如手动malloc&ing;),在.Net中,你不能以任何方式搞乱内存,以便在另一个dll中引起0x05; 99%这个特定的IE具有特定的配置是所有事情的原因,因此您最快的解决方案是调试,找到有问题的代码,然后压缩您拥有的每一个信息并将其邮寄给MS。