Windows服务不会停止并重新启动

时间:2010-10-07 06:23:34

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

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

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

在打开到SQL Server 2008数据库的ODBC连接之前,它似乎失败了。我可以确认服务在重新启动之前实际退出;然而,当它停止并重新启动时,我偶尔会得到这个错误,但是如果我一次又一次地手动停止并重新启动服务,我就永远不会让它失败,如果我从终端端口控制进程并手动退出从那里它也永远不会失败。

如果我尝试附加调试器,则进程退出,因此我无法收集任何有用的信息。

我正在试图弄清楚发生了什么,但我不知道从哪里开始。有人有什么想法吗?

2 个答案:

答案 0 :(得分:0)

不是直接的答案,但如果你在Vista(以及我认为的后期),你有机会尝试:

  

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

     

Windows Vista引入了一面新旗帜,   FailureActionsOnNonCrashFailures,   如果他们想要哪些服务设置   能够通知SCM发起一个   失败行为:请参阅Vista services

中的详情

答案 1 :(得分:0)

使用Process Dumper在此流程上设置流程转储的自动生成。你应该能够调试dump post mortem来解决为什么会发生这种零星的异常。

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

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

相关问题