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

问题描述 投票:0回答:1
作为免责声明,我将其发布在这里,因为我只看到有关这种行为的评论,人们已经指出了系统可能存在的问题。如果这不是发布此信息的正确位置,请告诉我,我将在人们提出编码问题的地方发布。

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

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

[5/28/20,下午5:05至5:16,我们有5次此服务崩溃。每次系统显示错误消息“因为[我们的服务名称]服务意外终止,Windows现在必须重新启动”。当我查看崩溃转储时,每次它都坐在对sprintf()的调用上,该调用堆栈在_invoke_watson()处结束。当我第一次打开故障转储时,崩溃的错误对话框显示“未处理的异常...:无效的参数已传递给C运行时函数。”当我查看sprintf调用时,相关的行是:

char buff[10]; if (sprintf_s(buff, sizeof(buff)/sizeof(buff[0]), "%04d%02d%02d", iyear, imonth, iday) < 0)

这些崩溃是在sprintf_s()调用上。 iyear,imonth,iday都是整数,因此它们必须具有值,但它们是从FILETIME结构(由对GetSystemTimeAsFileTime()的调用填充)中检索的值,该值已转换为SYSTEMTIME结构(由a填充)调用FileTimeToSystemTime()。但是无论哪种方式,一个int应该是一个int。

[当我在系统事件查看器中查看时,对于每次崩溃,它给出的异常代码为0xc0000417,并且系统事件ID为1000(这当然意味着由于未知事件而崩溃)。

我被这一事实所吸引,除了在这13分钟的时间跨度内,这从未发生过,也从未发生过。我正在尝试进一步研究这个问题,但是我不知道为什么仅在15分钟的时间内进行一个简单的sprintf调用就能做到这一点。

有人对我应该“询问”系统的问题有任何建议吗?我非常擅长系统工作,但不是系统专家。任何对我继续前进的建议将不胜感激。

再次,如果这是发布此问题的错误位置,请让我知道。

作为免责声明,我将其发布在这里是因为我只看到有关这种行为的评论,人们已经指出了系统可能出现的问题。如果不是...

windows-7 crash service c++
1个回答
1
投票
您必须超越buff。诸如%04d之类的格式说明符不能保证缓冲区中的字符串不能超过4个字符,因此,如果iyear以某种方式包含> 9999的值,则您将写出超过4个字符的空格对于。对于imonthiday同样。
© www.soinside.com 2019 - 2024. All rights reserved.