[英]Silverlight 5 - Debugging npctrl.dll crash
我得到了一個非常令人沮喪的Silverlight插件崩潰,影響了IE和Firefox。
事件日志中的錯誤是:
Faulting application name: iexplore.exe, version: 9.0.8112.16421, time stamp: 0x4d76255d
Faulting module name: npctrl.dll, version: 5.0.61118.0, time stamp: 0x4ec5fc64
Exception code: 0xc0000094
Fault offset: 0x0001d720
Faulting process id: 0x434
Faulting application start time: 0x01ccf0b878b55ca7
Faulting application path: C:\Program Files (x86)\Internet Explorer\iexplore.exe
Faulting module path: c:\Program Files (x86)\Microsoft Silverlight\5.0.61118.0\npctrl.dll
Report Id: bd79af3d-5cab-11e1-8948-000c29de3e25
我已經在異常期間附加WinDbg以獲取更多信息:
(17e4.13f8): Break instruction exception - code 80000003 (first chance)
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\SYSTEM32\ntdll.dll -
ntdll!DbgBreakPoint:
00000000`77810530 cc int 3
0:029> g
(17e4.1790): Integer divide-by-zero - code c0000094 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
*** ERROR: Symbol file could not be found. Defaulted to export symbols for NPCTRL.dll -
NPCTRL+0x1d720:
7b59d720 f7f1 div eax,ecx
好的,所以ntdll.dll除以零。 我真的不知道如何進一步調試。 我試過查看一些解釋如何的文章 - 但我認為我的限制是基於ntdll.dll沒有可用的符號這一事實?
如何縮小我的代碼的哪一部分導致此錯誤?
經過幾個小時的調試,我能夠在一個小項目中復制問題。 只需創建一個“支持Silverlight的Web服務”,並引用它。 然后切換到使用客戶端http堆棧:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
在我的機器(以及同事)上調用服務有大約10-15%的可能性與ntdll.dll錯誤崩潰。
我找到了兩種方法來緩解這個問題。
1)停止使用客戶端網絡堆棧。 瀏覽器堆棧似乎永遠不會發生這個問題
2)訪問VMWare外部的silverlight應用程序。 問題似乎只發生在虛擬機中。 感謝RobSiklos解決這個問題。
希望這有助於某人。
將Vmware虛擬機設置為僅使用1個處理器,問題將無法重現。 從屏幕頂部虛擬機>虛擬機設置>處理器 - >處理器核心數= 1。
您是否在vmware虛擬機內運行? 請參見此處: http : //communities.vmware.com/thread/394306?tstart = 0
更新(2013-03-15):根據上面鏈接的論壇帖子中的最新帖子,似乎微軟終於解決了這個問題。
如果您在虛擬機中運行silverlight應用程序,那么如果您真的非常絕望並需要讓它運行,您可以嘗試這個。
如果您在同一網站或同一過程中運行silverlight應用程序和數據提供程序,請嘗試拆分它們。 讓我解釋...
我的應用程序有3個選項,(1)DIRECT DATABASE CONNECTION(這里不適用),(2)WEB SERVICE或(3)HTTP aspx頁面。
每當我使用選項2和3但在同一站點內調用提供程序時,應用程序很快就會崩潰。 但是我注意到,當我調用托管在另一個域(跨域)上的相同(或不同)Web服務時,它不會崩潰。
我的silverlight應用程序很大程度上依賴於並發運行的線程。 我不確定它是否與線程有關,或者為什么w3w進程和iexplore進程在VM內部不能很好地協同工作。
我也得到了“除以零”錯誤,但這就是我解決它的方式。 所以,相同的代碼,相同的一切,除了silverlight應用程序及其托管的網站使用不同的網站或Web服務作為其數據源(即使該數據源網站在同一個虛擬機上)
這有意義嗎?
因此,在http://localhost/app.aspx
運行的S / L應用程序使用在https://itisqa-d1/folder1/service1.svc
運行的WCF服務。 在這種情況下,itisqa-d1和localhost可能是也可能不是同一台機器,只要它們在單獨的應用程序域或池中運行即可。
這些Windbg命令將從Microsoft的符號服務器加載ntdll.dll(和其他Microsoft模塊)的符號。
.symfix
.reload / f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.