什么原因导致Star​​tServiceCtrlDispatcher()失败1063(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

时间:2015-05-26 16:30:43

标签: windows winapi windows-services

我在Windows服务程序中看到了奇怪的错误。我的服务程序在其main()的最开头调用1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT),但有时会因StartServiceCtrlDispatcher()而失败。

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

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

  • 这个问题似乎只发生在这个程序的所有用户的几个百分点上。
  • 即使问题发生,也似乎没有重复。下次服务通常会成功启动。
  • 发生此问题时, Function onlyDigits(s As String) As Integer 会在失败前返回约一秒钟。

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

2 个答案:

答案 0 :(得分:7)

正如你已经可以看到谷歌没有答案和任何东西,问题并不常见。我相信问题在于你的服务,并且它是从进程的开始到StartServiceCtrlDispatcher()执行的代码,并且很可能需要某种形式的破坏系统资源,可能是堆或HANDLE

听到这个消息你会感到很遗憾,但我不会对你的问题有一个神奇的答案。相反,我可以建议一些故障排除。

Microsoft Application Verifier在查找损坏方面非常有用。我建议你:

  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安装到客户端的计算机上。它没有太大的危害,当我自己找不到错误时,我有时会这样做。

答案 1 :(得分:0)

提示:我使用_wfopen / fwrite / fclose来记录一些消息。不知何故,183被内部抛出并导致了这次失败1063.我删除了日志记录,它开始正常工作,因为什么都没发生。任何分钟错误都可能导致您。从服务开始,它将列出工资错误(在我的情况下为183)。