我看到我的Windows服务程序奇怪的错误。 我的服务程序在main()
的最开始处调用StartServiceCtrlDispatcher()
,但有时会失败,并返回1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
。
我知道如果用户手动启动程序(作为控制台程序),则会发生此错误。 但事实并非如此。 我添加了一个代码来检查服务程序的父进程,当这个错误发生时,它告诉services.exe是父进程(我认为可以安全地假设我的程序是由SCM正确启动的)。
不幸的是,这个错误不能在我的开发机器上重现,并且不能自己debugging,但是在用户系统上捕获的错误日志告诉:
StartServiceCtrlDispatcher()
在返回失败前暂停大约一秒。 有没有人看过类似的错误? 如果是这样,错误的原因是什么?
正如你已经看到从谷歌没有答案和任何东西,这个问题并不常见。 我相信这个问题是在你的服务中,而且是在从StartServiceCtrlDispatcher()
开始的过程中执行的代码,最有可能的是它需要某种形式的破坏系统资源,可能是堆或HANDLE
。
听到这个,你可能会感到抱歉,但是我不会对你的问题有个神奇的答案。 相反,我可以提出一些疑难解答。
Microsoft应用程序验证程序在查找损坏方面非常重要。 我建议你:
Basics\Heaps
。 Basics\Handles
。 与Basics\Heaps
不同,这有时会Basics\Heaps
“误报” – 代码中的错误不会造成太大的伤害。 无论如何,既然你在追捕,你最好修好一切你能找到的东西。 我最担心的是释放一个HANDLE
或类似的东西。 释放服务管理器的HANDLE
肯定会导致你的问题。 Basics\*
其他选项,但我不认为这会有所帮助。 main()
和StartServiceCtrlDispatcher()
之间的代码以及您可以拥有的全局构造函数。 寻找潜在的缓冲区溢出和HANDLE
的错误。 提示:我用_wfopen / fwrite / fclose记录了一些消息。 不知怎的,183被内部抛出,并导致这个失败1063.我删除了日志记录,并开始正常工作,因为什么也没有发生。 任何微小的错误都可能导致你。 从服务开始,它会列出工资错误(在我的情况下为183)。