【发布时间】:2018-03-28 12:20:28
【问题描述】:
所以我开发这个程序已经有一段时间了……它的目的是充当我们 IT 团队的资产经理(未来可能更多)。我有 2 项服务,我们现在将其称为“经理”和“IAM”。 “经理”负责所有服务(目前只有库存资产经理称为“IAM”)的所有管理工作,例如自动更新等,而资产经理负责其工作。
无论如何,它已经运行了一段时间了。最近我实现了一个自动更新功能(实际上仍然需要测试和调试)。这样做时,我需要让我的命名保持一致(例如,将我的服务从“Updater”和“CppWindowsService”重命名为软件的实际名称)。
在此之前,它一直运行良好!启动、停止、安装和卸载没有任何问题。我更改了所有内容的名称,并确保一切正常。看起来不错。安装现在对“Manager”和“IAM”都很好,但是当我尝试启动它时,我得到:
启动服务失败 (1053)
此外,当我尝试从 services.msc 启动它时,我收到以下错误消息:
Windows 无法在本地计算机上启动服务。
错误 1053:服务没有及时响应启动或控制请求
不过,奇怪的是它不会等待任何形式的超时。它只是立即吐出消息。该消息来自我的 wmain()(Windows 入口点。main() 否则。)函数调用的代码。
if (!StartService(
schService, // handle to service
0, // number of arguments
NULL)) // no arguments
{
printf("StartService failed (%d)\n", GetLastError());
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return;
}
else printf("Service start pending...\n");
在 Windows 事件日志中,我收到一个包含以下详细信息的应用程序错误。
错误应用程序名称:InITManager.exe,版本:0.0.0.0,时间戳:0x59e11e44
故障模块名称:ucrtbase.dll,版本:10.0.15063.674,时间戳:0x8ac9f9d4
异常代码:0xc0000409
故障偏移:0x000000000007350e
故障进程ID:0x3008
错误应用程序启动时间:0x01d346915918e17d
错误的应用程序路径: C:\Users\collin.walker\Desktop\InITService\C++\x64\Release\Manager.exe
故障模块路径:C:\WINDOWS\System32\ucrtbase.dll
报告 ID:7fcbdcc4-be8e-476a-960f-4fa1fb21f892
故障包全名:
错误的包相关应用程序 ID:
其他信息:ucrtbase.dll 由 Visual Studio 使用并与发布版本相关联,而 ucrtbased.dll 与调试器版本相关联。我正在发布模式下构建。
现在,我已经被告知问题不是我的代码,但是如果有人觉得他们需要查看它,那么我会包含它。虽然它是非常简单的 c++ winapi 东西。
如果有人对如何解决此问题有任何进一步的建议,请告诉我,并提前感谢所有帮助!
【问题讨论】:
-
它与ucrtbase.dll没有任何关系,它只是坏消息的承载者。 0xc0000409 是一种讨厌的异常,当您的代码损坏堆栈帧时会引发它。最典型的是一个 char[] 局部变量,您在其中复制了太多 char。常见的失误,让代码在另一台机器上可靠地运行是项目的另外 90%。使用附加的调试器运行它,以便在它发生时中断。
-
@HansPassant,
ucrtbase + 7350e是 CRT 的abort函数中的 int 0x29 指令。这是__fastfailintrinsic 的KERNEL_SECURITY_CHECK_FAILURE,代码为FAST_FAIL_FATAL_APP_EXIT(7)。中断由KiRaiseSecurityCheckFailure提供服务,从而引发STATUS_STACK_BUFFER_OVERRUN(0xC0000409)。 -
太棒了,帮了很多忙!谢谢!我感谢所有的帮助! (不是/s)
-
@eryksun 我对您如何识别这些信息很感兴趣(它非常有用)我创建了一个单独的帖子来学习如何在stackoverflow.com/questions/51251391/… 上执行您所做的操作,并希望收到您的来信你!
-
很遗憾@eryksun 没有回复——我也需要知道这个信息。