.NET Windows 服务在 ntdll.dll 中崩溃

Posted

技术标签:

【中文标题】.NET Windows 服务在 ntdll.dll 中崩溃【英文标题】:.NET Windows Service crashes in ntdll.dll 【发布时间】:2012-04-25 13:02:21 【问题描述】:

我有一个用 C# 编写的 Windows 服务。它在调用第 3 方 COM 组件时崩溃。该问题仅出现在 Windows 7(x86 和 x64)上。当我在 Windows 7(x86 和 x64)上运行与控制台应用程序相同的服务代码时,它运行良好。

当我在 Windows 2003 上运行相同的服务时,它也可以正常工作。我认为这可能与UAC有关。我正在寻找有关调试此服务的建议/指导,以确定导致问题的原因。对 ntdll.dll 使用调试符号?在事件日志中的信息下方。

Event ID: 1000, Level: Error
Faulting application name: ServiceHost.exe, version: 1.0.0.0, time stamp: 0x4f87bc9a
Faulting module name: ntdll.dll, version: 6.1.7601.17725, time stamp: 0x4ec49b60
Exception code: 0xc0000005
Fault offset: 0x0002bcbb
Faulting process id: 0x151c
Faulting application start time: 0x01cd1939c9017b2d
Faulting application path: E:\ServiceHost\bin\Debug\ServiceHost.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 08da6aa3-852d-11e1-a889-00155d016f32

【问题讨论】:

HexCode 表示拒绝访问,这就是我 +1 @AgentFire 的原因。如果他的提示没有帮助,您将不得不进行内存转储以收集更多信息。关于 ntdll.dll 的符号,您只能获取公共符号,它们只会告诉您函数名称,您需要私有符号才能发现更多。 这里没有拒绝访问错误。 0xc0000005 是访问冲突。 制作一个简单的程序来重现故障并将其发送给第 3 方供应商 【参考方案1】:

大胆猜测,您可能会与Session 0 Isolation 发生冲突:

在 Windows XP®、Windows Server® 2003 和更早版本的 Windows® 操作系统中,所有服务都在与登录控制台的第一个用户相同的会话中运行。此会话称为 Session 0。在 Session 0 中同时运行服务和用户应用程序会带来安全风险,因为服务以提升的权限运行,因此是寻求提升自身权限级别的恶意代理的目标。

这通常会导致服务出现问题,例如,某些东西试图创建 UI。

处理此问题的最简单方法是与第 3 方组件的供应商交谈,并确保它支持与服务一起使用。但是,如果供应商不再存在,那可能就不可能了。

如果在服务运行时出现问题,则可以将调试器附加到它并在错误发生时捕获转储(例如,使用类似 adplus 的东西从Windows 的调试工具)。如果问题是在服务启动期间发生的,则诊断可能会比较棘手。

您确实需要隔离您的代码中导致错误的最后一个函数调用,然后尝试从那里进行诊断。

【讨论】:

这是个好建议。崩溃不是在启动期间。我今天试试这个。 我能够确定这是原因。 COM 组件正在尝试通过调用 CreateDC (msdn.microsoft.com/en-us/library/dd183490(v=vs.85).aspx) 创建设备上下文。我将不得不联系供应商,看看这是否真的需要。【参考方案2】:

尝试将服务帐户更改为任何其他帐户。喜欢Local System

【讨论】:

我已将该帐户设置为作为我的帐户运行,该帐户是本地管理员组的成员。我会换个帐号试试看。 这还不够。无论如何,您的管理员帐户可能没有系统权限。 不,这个问题与 Damien 的回答有关。会话 0 隔离。【参考方案3】:

第 3 方 COM 组件正在使用一些 hack(一些释放的 API)来提高其性能,并且在 Windows 的下一个版本中,OS 接口已更改,恕不另行通知。

这是早期 Windows(Norton、Office...)的旧策略,用于直接调用内核和...

【讨论】:

我不相信这个原因。 COM 组件包装了一些 CORBA/HTTP 请求。

以上是关于.NET Windows 服务在 ntdll.dll 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 服务中使用 Quartz.Net 安排任务?

.Net Core WebApi在Windows服务器上部署

域服务器和域外客户端中的 net.tcp wcf 服务(托管 Windows 服务)

.NET Windows 服务在 ntdll.dll 中崩溃

如何在 .Net 中为 Windows 服务创建 Web 界面? [关闭]

.Net 2.0 Windows 服务进程通信:数据库还是 IPC?