Silverlight 5-调试npctrl.dll崩溃

本文关键字:dll 崩溃 npctrl 调试 Silverlight | 更新日期: 2023-09-27 18:25:31

我遇到了一个非常令人沮丧的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 5-调试npctrl.dll崩溃

经过数小时的调试,我能够在一个小项目中复制这个问题。只需创建一个"silverlight enabled web service",并引用它。然后切换到使用客户端http堆栈:

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

在我的机器(以及同事)上调用该服务时,发生ntdll.dll错误的几率约为10-15%。

我找到了两种方法来缓解这个问题。

1) 停止使用客户端网络堆栈。浏览器堆栈似乎从未出现过问题

2) 访问VMWare外部的silverlight应用程序。这个问题似乎只发生在虚拟机内部。感谢RobSiklos解决了这个问题。

希望这能帮助到别人。

将Vmware虚拟机设置为仅使用1个处理器,问题将不会重现。从屏幕顶部的"虚拟机">"虚拟机设置">"处理器"->"处理器内核数"=1。

您是否在vmware虚拟机内运行?请参见此处:http://communities.vmware.com/thread/394306?tstart=0

更新(2013-03-15):根据上面链接的论坛帖子中的最新帖子,微软似乎终于解决了这个问题。

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