【发布时间】:2011-12-26 08:05:54
【问题描述】:
我有一个 C# 服务作为 LocalSystem 帐户运行,它根据需要启动许多其他进程。这几个月来一直很好。就在本周,一些子流程正在崩溃。我为它们附加了一个远程调试器,它们在内存分配中失败(C++ new 运算符返回 0x0),这是导致崩溃的间接原因。
有趣的是,如果我将 RDP 导入机器,我可以轻松地从 CMD 启动进程,没有任何问题。然而,当服务启动它时,就不行了。
机器运行的是 Windows XP SP3。它不超出提交费用大约是物理 RAM 的 80%。
对于服务可以使用多少进程或多少内存(包括由该服务生成的进程)是否有一些特殊限制??
这些进程无法分配内存的任何其他想法。
编辑:
我已经很好地查看了来自 SysInternals 的 Procmon 崩溃场景,但它没有显示任何内容(我可以看到)。一切看起来都很正常,然后突然崩溃。我可以通过附加远程调试器确认它在从 c++ 新调用取消引用空指针后崩溃。这是应用程序中分配的首批对象之一,它永远不会失败。
我还发现,如果我启用服务选项:允许服务与桌面交互,那么所有子进程都会正确启动。但是,当您通过 RDP 连接时,do 会出现在桌面上,如果您通过 RDP = YUK 注销,则会不幸终止!不过,这仍然不是一个理想的解决方案 - 我真的很想知道为什么子进程在第 6 个子进程之后无法分配内存。
【问题讨论】:
-
请在帖子中添加来自这些崩溃的事件查看器中的错误消息。
-
事件日志中的唯一消息是来自调试器未能加载然后应用程序崩溃(读取无法访问的地址):“MDS_16.exe [456] 中发生未处理的 win32 异常。Just-In -时间调试此异常失败,出现以下错误:调试器无法启动,因为没有用户登录。请查看文档索引以获取“即时调试,错误”以获取更多信息。有关更多信息,请参阅帮助和支持以go.microsoft.com/fwlink/events.asp为中心。”
-
正如我之前提到的,我可以远程调试崩溃的进程,并且有一个 C++ 新调用返回 null,它正在被取消引用,从而兑现崩溃。真正的问题是进程无法分配内存来启动。
-
我了解这些进程即使在运行服务时也具有图形界面。所以最好检查它们的内核对象使用情况。在任务管理器,进程选项卡,菜单查看/选择...中,添加工作集(内存)&句柄&线程&用户对象&GDI对象。寻找稳定递增的计数器,尤其是在发生崩溃时,因为它们有一个上限。
-
您实现了自己的
operator new,还是使用了CRT提供的operator new?
标签: windows windows-xp memory service