【发布时间】: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