Silverlight 5 - 调试 npctrl.dll 崩溃
Posted
技术标签:
【中文标题】Silverlight 5 - 调试 npctrl.dll 崩溃【英文标题】:Silverlight 5 - Debugging npctrl.dll crash 【发布时间】:2012-03-12 01:45:34 【问题描述】:我遇到了一个非常令人沮丧的 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 没有可用的符号?
如何缩小导致此错误的代码部分?
【问题讨论】:
我们能看到发生崩溃的代码吗? 不幸的是,我不确定是什么原因造成的。它有点随机 - 这意味着它可能是我的服务调用(利用 ChannelFactory经过数小时的调试,我能够在一个小项目中重现该问题。只需创建一个“启用silverlight 的网络服务”,然后引用它。然后切换到使用客户端http栈:
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);
在我的机器(以及我的同事)上调用该服务有大约 10-15% 的机会因 ntdll.dll 错误而崩溃。
我找到了两种方法来缓解这个问题。
1) 停止使用客户端网络堆栈。浏览器堆栈似乎永远不会出现问题
2) 在 VMWare 之外访问 silverlight 应用程序。这个问题似乎只发生在虚拟机内。感谢 RobSiklos 解决这个问题。
希望这对某人有所帮助。
【讨论】:
是的,这对我有帮助 - 当我在 VM 服务器上运行它时,它会在 SLLAuncher.exe 中引发除零错误 - 但是从外部访问它可以正常工作。 完全蹩脚!切换到 ClientHttp 解决了调用 WCF 服务时出现的奇怪的间歇性错误。【参考方案2】:将 Vmware 虚拟机设置为仅使用 1 个处理器,问题将不会重现。 从屏幕顶部虚拟机 > 虚拟机设置 > 处理器 - > 处理器核心数 = 1。
【讨论】:
这为我修好了!谢谢!我在 IE9 和 IE10 中分别使用 Windows 7 和 Windows 8 在 Mac OS X 上运行 VMware Fusion 时遇到了同样的问题。 它也为我修复了。谢谢【参考方案3】:您是否在 vmware 虚拟机中运行?见这里:http://communities.vmware.com/thread/394306?tstart=0
更新(2013-03-15):根据上面链接的论坛帖子中的最新帖子,微软似乎终于解决了这个问题。
【讨论】:
是的,看来我在环境差异方面得出了错误的结论。 更新了我的答案,以反映 VMware 可能是原因而不是开发 sdks/运行时。【参考方案4】:这些 Windbg 命令将从 Microsoft 的符号服务器加载 ntdll.dll(和其他 Microsoft 模块)的符号。
.symfix
.reload /f
【讨论】:
这似乎起到了作用.. 但是 !analyze -v 仍然毫无价值。【参考方案5】:如果您在虚拟机中运行 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 可能是也可能不是同一台机器,只要它们在不同的应用程序域或池中运行即可。
【讨论】:
以上是关于Silverlight 5 - 调试 npctrl.dll 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
调试 IIS Express Web 服务/silverlight 应用程序时出现安全错误
调试 Silverlight RIA 服务 SubmitChanges
无法启动调试。未安装Silverlight Developer运行时。最新运行时可以从以下地址下载: http://go.microsoft.com/fwlink/?LinkId=146060.