Windows 7 Windows现在必须重新启动,因为[我们的服务名称]服务意外终止

Windows 7 Windows现在必须重新启动,因为[我们的服务名称]服务意外终止,windows-7,crash,service,c++,Windows 7,Crash,Service,C++,作为免责声明,我在这里发布这篇文章是因为我只看到过关于这种行为的评论,人们指出系统可能存在问题。如果这不是发布此信息的正确位置,请让我知道,我将在人们询问编码问题的地方发布 话虽如此,我看到许多帖子说“windows现在必须重新启动,因为服务意外终止”。我的情况不同,投诉是关于我公司编写的专有服务 我的公司制造机器,目前其中一台作为发布版本在现场运行,出现了一些服务崩溃。专有服务是为这台机器编写的,并且已经过广泛的测试。它在Win32位上运行,Windows更新已关闭。该服务是用C++编写的,使

作为免责声明,我在这里发布这篇文章是因为我只看到过关于这种行为的评论,人们指出系统可能存在问题。如果这不是发布此信息的正确位置,请让我知道,我将在人们询问编码问题的地方发布

话虽如此,我看到许多帖子说“windows现在必须重新启动,因为服务意外终止”。我的情况不同,投诉是关于我公司编写的专有服务

我的公司制造机器,目前其中一台作为发布版本在现场运行,出现了一些服务崩溃。专有服务是为这台机器编写的,并且已经过广泛的测试。它在Win32位上运行,Windows更新已关闭。该服务是用C++编写的,使用VS201.

20年5月28日下午5:05到5:16之间,我们在这项服务上发生了5次不同的崩溃。每次系统显示错误消息“Windows现在必须重新启动,因为[our service name]服务意外终止”。当我查看崩溃转储时,每次它在调用sprintf()时,调用堆栈都以_invoke_watson()结尾。当我第一次打开崩溃转储时,崩溃的错误对话框显示“未处理的异常…:向C运行时函数传递了一个无效参数”。当我查看sprintf调用时,关联的行是:

char buff[10];
if (sprintf_s(buff, sizeof(buff)/sizeof(buff[0]), "%04d%02d%02d", iyear, imonth, iday) < 0)
charbuff[10];
如果(斯普林特夫(buff,sizeof(buff)/sizeof(buff[0]),%04d%02d%02d,艾迪州伊蒙特市艾尔)<0)
这些崩溃发生在sprintf_s()调用上。iyear、imonth、iday都是int,因此它们必须有值,但它们是从FILETIME结构(由对GetSystemTimeAsFileTime()的调用填充)检索的值,该结构已转换为SYSTEMTIME结构(由对FileTimeToSystemTime()的调用填充)。但无论如何,int应该是int

当我查看系统事件查看器时,对于每个崩溃,它都会给出一个异常代码0xc0000417和一个系统事件ID 1000(这当然意味着由于未知事件而崩溃)

我被这样一个事实所震惊,除了在这13分钟的时间里,这种情况以前从未发生过,以后也从未发生过。我正试图深入研究这个问题,但我不知道为什么一个简单的sprintf调用可以做到这一点,而且只能在15分钟内完成

对于我应该“询问”系统的问题,有人有什么建议吗?我非常擅长系统工作,但不是一个系统的家伙。如有任何建议,我将不胜感激


再次提醒,如果这是发布此问题的错误位置,请告诉我。

您一定是超限了
buff
。格式说明符(如
%04d
)不能保证缓冲区中的字符串长度不超过4个字符,因此如果
iyear
以某种方式包含值>9999,则写入的字符数将超过允许的4个字符数。对于
imonth
iday
也类似

因此,我将对这些值添加一些边界检查,以确保不会溢出缓冲区。如果它们超出范围(如应用程序事件日志),您还可以将它们输出到某种调试日志,以帮助您跟踪问题

至于在服务崩溃时关闭Windows,请参阅:(如果您还不知道的话)。

转到运行中的服务类型 并选择您的名称服务属性 转到选项卡恢复 第一个故障:重新启动服务 第二个故障:重新启动服务
后续故障:重新启动服务

FileTimeToSystemTime
确保代码检查返回值
一个int应该是int
这些实际上是SYSTEMTIME中的单词,当传递到
sprintf
时,这些单词会扩展为int<代码>20年5月28日下午5点在代码区域是否有任何3个月的日期算法?根据您所在的时区,这可能是2020年“闰日”开始后的3个月。是的,返回值确实没有被检查。我将把它添加到我的代码更改建议中。此代码中没有3个月的日期算法。这台机器在日本,那么这会改变与2020年闰日的关系吗?在这种情况下,这只是一条红鲱鱼,没有3个月的补偿。非常感谢。这对我的思考很有帮助。我忽略了以下事实:1)SYSTEMTIME结构中返回的信息可能已损坏,并导致生成的字符串长度增加;2)从您的文章中,我意识到一定有人将恢复选项更改为“重新启动计算机”,而不是原来的“重新启动服务”已设置的选项。此类事件始终与环境/硬件相关。这里所有的软件建议都是有用的,但是。。。一个问题:您是否在主服务中捕获结构化异常?除了之外,我们从顶部保存小型转储文件。复数的它们针对您的服务,在各种“海森堡”情况下都是无价的。如果是C++,为什么不玩它有点安全?code>charbuff[0xF]{0};如果(sprintf_s(buff,0xF,“%04d%02d%02d”,iyear,imonth,iday)<0)。。使用前多留一点空间并调零。