Silverlight 5 – 调试npctrl.dll崩溃

我得到一个非常令人沮丧的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 

我已经在exception期间附加了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):根据上面链接的论坛post中的最新post,似乎微软终于解决了这个问题。

这些Windbg命令将从Microsoft的符号服务器加载ntdll.dll(和其他Microsoft模块)的符号。

.symfix

.reload / f

如果您在虚拟机中运行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可能是也可能不是同一台机器,只要它们在单独的应用程序域或池中运行即可。