我有一個Internet Explorer擴展(BHO),可以很好地在數千臺機器上運行,但在某些情況下,似乎會導致Flash以iexplore.exe的方式崩潰。我能做些什麼來避免這種衝突?如何更改我的IE擴展以解決另一個模塊(flash.ocx)中的訪問衝突導致IE崩潰?
更多細節:
在一個客戶的環境,我們有一個情況下訪問使用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
這是閃光的一個相當新的版本,但不是最新的。他們已經嘗試升級到最新版本,但具有相同的症狀。
他們的工作站已經運行Sophos Antivirus,並且在一些極少數情況下,我們看到防病毒引發了我們擴展的問題。我們在停止了所有提及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(空)方法我有清理幾行代碼,像
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相關...
我不知道是否有鏈接,但我認爲iexplore.exe是一個64位的應用程序,而Flash的ActiveX和jscript9.dll是32! – akmozo 2015-02-08 23:12:58
使用IE9 32位IE通常是64位機器上的默認設置,除非有人已經做了一些非常特殊和奇怪的事情來使64位成爲默認設置。在這種情況下,他們是32位工作站,所以它絕對是32位IE。 – Rory 2015-02-08 23:31:24
是否有可能分享您的IE擴展來測試它,可能有人可以重現該問題,並可以幫助識別其來源? – akmozo 2015-02-08 23:38:30