【问题标题】:Windows c++ service faulting on ucrtbase.dll when starting启动时 ucrtbase.dll 上的 Windows c++ 服务出错
【发布时间】: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 指令。这是__fastfail intrinsicKERNEL_SECURITY_CHECK_FAILURE,代码为FAST_FAIL_FATAL_APP_EXIT (7)。中断由KiRaiseSecurityCheckFailure 提供服务,从而引发STATUS_STACK_BUFFER_OVERRUN (0xC0000409)。
  • 太棒了,帮了很多忙!谢谢!我感谢所有的帮助! (不是/s)
  • @eryksun 我对您如何识别这些信息很感兴趣(它非常有用)我创建了一个单独的帖子来学习如何在stackoverflow.com/questions/51251391/… 上执行您所做的操作,并希望收到您的来信你!
  • 很遗憾@eryksun 没有回复——我也需要知道这个信息。

标签: windows dll service fault


【解决方案1】:

在我的故障排除过程中有点忘记了这篇文章......无论如何,我想通了。上面的评论很到位!

对我来说,缓冲区溢出是因为我更改了服务名称,这也更改了程序目录名称。当我在服务的构造函数中初始化日志对象时发生了错误。我在构造函数中只有两行代码,所以我完全忘了看那里。更改了创建日志的硬编码目录位置,一切都开始工作了!感谢大家提供有用的信息!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2011-07-25
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多