【问题标题】:Windows service won't stop and restartWindows 服务不会停止并重新启动
【发布时间】:2010-10-07 06:23:33
【问题描述】:

我用C++写了一个windows服务,需要每晚午夜重启,所以我在它上面调用exit(1),这样它就可以被SCM重启了。问题是似乎每隔一个晚上它就会部分启动并挂起。在事件日志中,我得到了这个:

应用程序弹出 - 应用程序错误:“0x0043c145”处的指令引用了“0x00000035”处的内存。无法“读取”内存。

在打开与 SQL Server 2008 数据库的 ODBC 连接之前似乎失败了。我可以确认服务在重新启动之前实际退出;尽管如此,当它停止并重新启动时,我每隔一段时间就会收到此错误,但是如果我一遍又一遍地手动停止和重新启动服务,我永远不会让它失败,并且如果我从终端端口控制进程并手动退出从那里它也永远不会失败。

如果我尝试附加调试器,进程会退出,所以我也无法通过这种方式收集任何有用的信息。

我绞尽脑汁想弄清楚发生了什么,但我不知道从哪里开始。有人有什么想法吗?

【问题讨论】:

  • 进程是否在 exit() 之后完全终止?让我们先用 SCM 的非自动重启 cfg 进行测试。
  • 你不应该使用 exit() 来退出服务;为了与 SCM 通信并正常关闭,您必须遵循一个协议。将调试器附加到正在运行的服务不应导致它意外退出,因此听起来有些东西坏了。该错误消息表明您的代码可能试图在某处取消引用 NULL 指针。
  • Pinichi,我今晚试试
  • 卢克,我确实在那里关闭并重新启动,但我不确定我是否设置了 SCM 的状态以通知服务已停止并自行清理。我会调查的。但问题是,我可以根据需要多次重启,而不会产生明显的不良影响。我也可以关机。只要我手动执行,无论执行多少次都没有问题,但是如果让它自行运行,它将偶尔无法重新启动。
  • 另一件事:我在另一个 Windows Server 2003 机器上运行了它,并且在该机器上重新启动它从来没有失败过。在这一点上它确实如此。我敢肯定有很多不同,但我印象深刻的一个是我在另一个盒子上安装了 SQL Server Native Client 10,而它不在这个盒子上,所以我有点想知道当前盒子上的 ODBC 驱动程序是否与 SQL Server 2008 通信时时遇到问题。

标签: c++ windows visual-c++ service odbc


【解决方案1】:

不是直接的答案,但如果您使用 Vista(以及我认为的后续版本),您可以尝试一下:

"服务通知 SCM 排队 通过输入失败动作 SERVICE_STOPPED 状态和设置 SetServiceExitCode 函数的 dwWin32ExitCode 参数到任何东西 除了 ERROR_SUCCESS。”

Windows Vista 引入了一个新标志, FailureActionsOnNonCrashFailures, 如果他们想设置哪些服务 能够通知 SCM 启动一个 失败操作:在Vista services中查看更多信息

【讨论】:

  • 不幸的是,我使用的是 Windows Server 2003。应该提到这一点,抱歉,但此信息将来会有用。
【解决方案2】:

使用Process Dumper 在此进程上设置自动生成进程转储。您应该能够调试转储事后分析,以找出为什么会发生这种零星异常。

添加有关您的数据库访问的诊断信息以查看在异常发生之前取得的进展也很有用。我想知道如果您安排一个任务在午夜关闭服务清理,然后在关闭完成后再次启动它,您的退出/重启策略是否会更好。

在之前使用exit(1) 关闭后,盒子上的 ODBC 可能处于一种奇怪的状态。当您尝试重现此内容时,您会说您停止并启动它-在这种情况下退出模式是否相同?您能否在您的退出和目标服务器上重新启动之间引入一个短暂的延迟,以便清理 ODBC 连接状态?

【讨论】:

  • 我在机器上安装了进程资源管理器,我将尝试在进程挂起并将其加载到 Visual Studio 后对其进行完整转储。试了之后好像还可以,现在我只需要在合适的时间抓住它,看看哪里出了问题。
  • 退出模式始终相同。这是一个缓慢的启动过程,因为它缓存了数据库中的大量内容。启动可能需要 6-10 秒。由于我正在调用 exit(1),它应该等待一分钟再重新启动,因为它认为这是一个失败条件。我可以延长它以查看会发生什么,但我不确定,因为如果我再次通过 SCM 手动执行此操作,无论是重新启动还是启动,它都会正常运行。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多