【问题标题】:What causes StartServiceCtrlDispatcher() to fail with 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?是什么导致 StartServiceCtrlDispatcher() 失败并显示 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?
【发布时间】:2015-05-26 16:30:43
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您是否仔细检查过您正在从主线程调用 StartServiceCtrlDispatcher,它是否在进程启动后的几秒钟内被调用,以及 SERVICE_ENTRY_TABLE 数组是否正确? (尤其要确保最后的条目是 {NULL, NULL}。)
  • 是的,SERVICE_ENTRY_TABLE 已正确终止。而且,关于时间,我忘了在我原来的问题中提及,但是在 StartServiceCtrlDispatcher() 失败后,我的代码检查了时间戳,通常大约是一秒(或less) 服务进程启动后。所以,我认为延迟不太可能导致错误。
  • 很奇怪。如果你不能确定一个共同的因素,那么你就很难调试,这样你就可以重现问题。作为一种可能的解决方法,如果第一次调用失败,也许您可​​以尝试再次调用 StartServiceCtrlDispatcher()?

标签: windows winapi windows-services


【解决方案1】:

正如您已经从谷歌上没有答案和任何内容中看到的那样,这个问题并不常见。我相信问题出在您的服务中,并且它存在于从进程开始到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. 下一步可能是将应用程序验证程序安装到客户端计算机上。害处不大,有时候自己找不到错误的时候就这么做。

【讨论】:

    【解决方案2】:

    提示:我使用 _wfopen/fwrite/fclose 来记录一些消息。不知何故,183 在内部抛出并导致此故障 1063。我删除了日志记录,它开始正常工作,因为没有任何反应。任何微小的错误都可能导致您犯错。从服务开始,它会列出工资错误(在我的例子中是 183)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2015-11-09
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多