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 的代理类)的结果,也可能与我的布局/过渡动画有关。换句话说,你所问的正是我想要找出的:) 如果您遇到除以零错误,您将不得不发布代码在代码中的某处您正在传递无效值,或者尝试转换或对无效值进行某种计算因为 DivideByZero 错误例如 1/0 将给出该错误.. 我没有除以零 - ntdll.dll 是。事实上,我的申请根本没有分工。如果我实际上是除以零,我会在托管代码中得到 DivideByZeroException。事实并非如此。 注意,我在 MS Connect 上输入了这个错误:connect.microsoft.com/VisualStudio/feedback/details/731642/… 【参考方案1】:

经过数小时的调试,我能够在一个小项目中重现该问题。只需创建一个“启用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 中未处理的异常

无法启动调试。未安装Silverlight Developer运行时。最新运行时可以从以下地址下载: http://go.microsoft.com/fwlink/?LinkId=146060.

Silverlight 5 中的资源文化问题

Silverlight 5 入门教程:Hello World程序