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

Sus*_*rai 11 windows winapi windows-services

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

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

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

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

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

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