4

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

更多细节:

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

如果该网站不在受信任的站点中,则该选项卡在保护模式下运行,并且崩溃的结果是一个窗口,显示该网页要运行 dw20.exe(即 Dr Watson)例子

如果该网站被添加到受信任的站点,则会将一个错误写入 Windows 应用程序事件日志,并且 IE 会重新打开该选项卡,并显示一条小的信息栏消息,说明 IE 从崩溃中恢复了它。无论哪种方式都令人沮丧!用户真的不在乎当他们关闭选项卡时进程是否崩溃,所以我很高兴有一个解决方法,这意味着不会向用户显示错误消息并且选项卡不会重新打开。

Windows 应用程序事件日志没有说太多,但它确实说 iexplore.exe 进程因模块闪存故障而崩溃:

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

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

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

我的扩展是使用 .NET 3.5 SP1 构建的,由于与其他扩展存在潜在的运行时冲突,这不是一种理想的方法,但目前就是这样。

如果我禁用我的扩展程序,问题就会消失。如果我禁用 Flash,问题就会消失。故障模块是Flash32_13_0_0_214.ocx强烈指出它在那里是一个错误,但我认为理论上它可能是我的代码中的一个问题。我的扩展没有执行任何非托管代码,所以不可能这样,所以我想不出我的扩展可以做任何可能导致 AccessViolation 的事情。这留下了 Flash 中存在错误的可能性,这似乎完全有可能,或者我与 IE 中的 COM 对象交互的方式存在问题。然而,Flash 团队不太可能调查这样的错误报告,除非我能指出一些具体且可复制的东西,而且现在我无法在任何开发机器上复制,所以这不是很好。即使它是 Flash 错误,从客户的角度来看,这与我的产品中的错误没有什么不同:要么我修复它,要么我的产品将被卸载,他们将保留 Flash。

选项

我希望的是一些关于:

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

  • 我能做些什么来复制这个问题……为什么这在其他几十家公司不是问题,而在这家公司却是一个问题?有什么想法可能是触发问题的环境因素,而不是在不同设置的工作站上?

  • 尝试获取崩溃转储或有关崩溃的其他诊断信息(例如崩溃时的 ProcMon)是否有任何意义?我没有进行此类诊断的专业知识,所以我想避免它,除非它可能会引导我回答我可以在我的产品中做哪些不同的事情或查明闪存模块中的确切错误(如果真的有是一个)。

  • 我很高兴有一种让它静默崩溃的方法,例如阻止 IE 在崩溃时重新打开选项卡。

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

到目前为止,我有一些随机的想法。它们中的任何一个听起来都值得尝试吗?

  • 使用 .net 4 重新编译
  • 在我的 SetSite(null) 方法(卸载扩展程序时发生的事件)中,我有几行清理代码,例如Marshal.FinalReleaseComObject(webBrowser)GC.Collect(). 删除其中一项或多项:可能 GC 或 COM 清理会弄乱 Flash 的内存空间。
  • 重新定位我的 dll。
  • 在工作站上卸载并重新安装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 无关的...

4

1 回答 1

3

问题是,使用 .Net,您几乎可以无所事事地主动弄乱内存。因此,除非您经常使用 Api 调用,否则很难因为您的代码中的某些东西导致错误。

在我看来,重新定位 dll 似乎是最有希望的事情;不与 GCC 混在一起似乎是一个非常好的选择(而且总是如此,不仅在这种情况下)。

另一个问题是,出错的不是你的模块,这是需要认真考虑的事情:不是你的代码试图到达另一个 dll 分配的内存区域,而是他们的代码试图弄乱你的 dll 的内存空间。

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

于 2015-02-13T10:21:03.443 回答