我的 Windows 服务程序出现奇怪的错误。我的服务程序调用StartServiceCtrlDispatcher()
在其 main()
的最开始, 但它有时会因 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
而失败.
我知道如果用户手动启动程序(作为控制台程序)会发生此错误。但是,事实并非如此。我添加了一个代码来检查服务程序的父进程,当发生此错误时,它告诉 services.exe 是父进程(我认为可以安全地假设我的程序是由 SCM 正确启动)。
不幸的是,这个错误不会在我的开发机器上重现,也无法自行调试,但在用户系统上捕获的错误日志告诉我们:
- 这个问题似乎只发生在这个程序所有用户的百分之几。
- 即使问题发生了,它似乎也不会重演。下次服务通常会成功启动。
- 发生此问题时,
StartServiceCtrlDispatcher()
停止大约一秒钟,然后返回失败。
有没有人见过类似的错误?如果是这样,错误的原因是什么?
最佳答案
正如您已经从谷歌上没有答案和任何内容中看到的那样,这个问题并不常见。我认为问题出在您的服务中,并且出在从进程启动到 StartServiceCtrlDispatcher()
期间执行的代码中,而且很可能它采用了某种形式的破坏系统资源,可能是堆或 HANDLE
的。
听到这个你可能会很难过,但我不会对你的问题有一个神奇的答案。相反,我可以提出一些故障排除建议。
Microsoft Application Verifier 在查找损坏方面具有无可估量的值(value)。我建议你:
- 将它安装到您的开发机器上。
- 将您的服务的 exe 添加到其中。
- 第一次只选择
Basics\Heaps
。 - 按保存。保持应用程序验证程序打开并不重要。
- 运行您的服务几次。
- 如果它崩溃了,调试它,崩溃会指向你的问题。
- 如果它没有崩溃,添加
Basics\Handles
。与Basics\Heaps
不同,这有时会引发“误报”——代码中的错误不会造成太大伤害。不管怎样,既然你在打猎,你最好把能找到的东西都修好。我主要担心双重释放HANDLE
或类似的东西。错误地释放服务管理器HANDLE
肯定会导致您的问题。 - 如果它仍然没有崩溃,您可以尝试
Basics\*
中的其他选项,但我认为这不会有帮助。 - 此时,您可能想要检查程序的
main()
和StartServiceCtrlDispatcher()
之间的代码,以及您可以拥有的任何全局构造函数。使用HANDLE
查找潜在的缓冲区溢出和错误。 - 下一步可能是将 Application Verifier 安装到客户的机器上。这没什么坏处,有时我自己找不到错误时会这样做。
关于windows - 是什么导致 StartServiceCtrlDispatcher() 失败并显示 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464132/