我有一个C#服务作为LocalSystem帐户运行,根据其需要启动许多其他进程。这已经好几个月了。就在本周,一些子流程正在崩溃。我已经为他们附加了一个远程调试器,他们在内存分配方面失败了(C ++ new operator返回0x0),这是导致崩溃的间接原因。
有趣的是,如果我将RDP插入机器,我可以轻松地从CMD启动这个过程没有问题。然而,当服务启动它时,不要去。本机正在运行Windows XP SP3。提交费用不在物理RAM的80%左右。
服务可以使用多少进程或内存有一些特殊限制,包括该服务产生的进程?
为什么这些进程无法分配内存的任何其他想法。
修改
我已经很好地了解了来自SysInternals的Procmon的崩溃场景,并且没有透露任何内容(我可以看到)。一切看起来都很正常,然后突然崩溃。我可以通过附加一个远程调试器确认它在从c ++新调用中取消引用空指针后崩溃了。这是应用程序中分配的第一个对象之一,它永远不会失败。
我还发现如果启用服务选项:允许服务与桌面交互,则所有子进程都会正确启动。但是,当您通过RDP进行连接时,do会出现在桌面上,如果您通过RDP = YUK注销,则很可能会终止!但这仍然不是一个理想的解决方案 - 我真的很想知道为什么子进程在第6个子进程之后无法分配内存。
答案 0 :(得分:5)
我希望这个答案能帮助将来的某个人...... 我有同样的问题 - 如果允许窗口被渲染,应用程序将运行正常,但如果在服务下运行并且不允许与桌面交互,则会在启动时崩溃。解决方案在于增加注册表中非交互式Windows工作站堆的大小,在我的机器上设置为512KB,而交互式Windows工作站堆为3072KB。
您可以转到
进行更改 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows
该值是一个长字符串。您需要更改 SharedSection 设置,如下所示:
个SharedSection = 1024,3072,512
第二个数字是交互式 Windows工作站堆的大小,最后一个是非交互式 Windows工作站堆的大小。如果删除最后一个数字,则交互式和非交互式Windows工作站堆将具有相同的大小。这就是我所做的。
请在此处阅读详细信息:http://support.microsoft.com/kb/184802
答案 1 :(得分:1)
服务可以使用多少进程或内存有一些特殊限制,包括该服务产生的进程?
作业对象可用于限制进程(或进程组)的内存使用情况,但需要将相关进程与该作业对象相关联。
服务流程没有这样的工作对象。
考虑使用注册表允许您从受影响的进程的启动进行调试:http://msdn.microsoft.com/en-us/library/a329t4ed.aspx
答案 2 :(得分:1)
您可能会发现SysInterals Procmon对查看流程的效果非常有用。