windows - 是什么导致 StartServiceCtrlDispatcher() 失败并显示 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

标签 windows winapi windows-services

我的 Windows 服务程序出现奇怪的错误。我的服务程序调用StartServiceCtrlDispatcher()在其 main() 的最开始, 但它有时会因 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) 而失败.

我知道如果用户手动启动程序(作为控制台程序)会发生此错误。但是,事实并非如此。我添加了一个代码来检查服务程序的父进程,当发生此错误时,它告诉 services.exe 是父进程(我认为可以安全地假设我的程序是由 SCM 正确启动)。

不幸的是,这个错误不会在我的开发机器上重现,也无法自行调试,但在用户系统上捕获的错误日志告诉我们:

  • 这个问题似乎只发生在这个程序所有用户的百分之几。
  • 即使问题发生了,它似乎也不会重演。下次服务通常会成功启动。
  • 发生此问题时,StartServiceCtrlDispatcher()停止大约一秒钟,然后返回失败。

有没有人见过类似的错误?如果是这样,错误的原因是什么?

最佳答案

正如您已经从谷歌上没有答案和任何内容中看到的那样,这个问题并不常见。我认为问题出在您的服务中,并且出在从进程启动到 StartServiceCtrlDispatcher() 期间执行的代码中,而且很可能它采用了某种形式的破坏系统资源,可能是堆或 HANDLE 的。

听到这个你可能会很难过,但我不会对你的问题有一个神奇的答案。相反,我可以提出一些故障排除建议。

Microsoft Application Verifier 在查找损坏方面具有无可估量的值(value)。我建议你:

  1. 将它安装到您的开发机器上。
  2. 将您的服务的 exe 添加到其中。
  3. 第一次只选择Basics\Heaps
  4. 按保存。保持应用程序验证程序打开并不重要。
  5. 运行您的服务几次。
  6. 如果它崩溃了,调试它,崩溃会指向你的问题。
  7. 如果它没有崩溃,添加Basics\Handles。与 Basics\Heaps 不同,这有时会引发“误报”——代码中的错误不会造成太大伤害。不管怎样,既然你在打猎,你最好把能找到的东西都修好。我主要担心双重释放 HANDLE 或类似的东西。错误地释放服务管理器 HANDLE 肯定会导致您的问题。
  8. 如果它仍然没有崩溃,您可以尝试 Basics\* 中的其他选项,但我认为这不会有帮助。
  9. 此时,您可能想要检查程序的 main()StartServiceCtrlDispatcher() 之间的代码,以及您可以拥有的任何全局构造函数。使用 HANDLE 查找潜在的缓冲区溢出和错误。
  10. 下一步可能是将 Application Verifier 安装到客户的机器上。这没什么坏处,有时我自己找不到错误时会这样做。

关于windows - 是什么导致 StartServiceCtrlDispatcher() 失败并显示 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464132/

相关文章:

windows - 没有 PgAdmin3 的 PostgreSQL win32/64 无窗口安装?

windows - "code-signed"Windows 应用程序是否不易受到病毒感染?

windows - Windows 上的 Mac 风格菜单,系统范围

windows - HPET 是否可以在 Windows 中直接访问?

c# - Web 应用程序中用于周期性任务的子系统

windows-services - 如何获取 CreateProcessAsUser 的有效用户 token ?

Windows客户端和Linux服务器之间的通信?

PHP日期计算

c++ - 将 C++ 程序转换为 Windows 服务?

c# - Debugger.Launch() 不工作