.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 中崩溃