Процессы, запущенные сервисом, не могут выделить память - PullRequest
2 голосов
/ 22 сентября 2011

У меня есть служба C #, работающая в качестве учетной записи LocalSystem, которая запускает множество других процессов в зависимости от своих потребностей. Это идет хорошо в течение нескольких месяцев. Только на этой неделе некоторые из подпроцессов терпят крах. Я подключил к ним удаленный отладчик, и им не удается распределить память (оператор C ++ new возвращает 0x0), что является косвенной причиной сбоя.

Забавно, что, если я включу RDP в машину, я могу легко запустить процесс из CMD без проблем. Тем не менее, когда служба запускает его, нет дела.

Машина работает под управлением Windows XP SP3. Это не из за коммитов около 80% физического ОЗУ.

Существуют ли какие-то особые ограничения на количество процессов или объем памяти, которые могут быть использованы службой, включая процессы, порожденные этой службой ??

Любые другие идеи, почему эти процессы не смогли бы выделить память.

EDIT:

Я хорошо посмотрел сценарий сбоя Procmon из SysInternals, и он ничего не показывает (что я вижу). Все выглядит так, как будто все идет нормально, затем внезапно вылетает. Я могу подтвердить от присоединения удаленного отладчика, что он падает после разыменования нулевого указателя из нового вызова c ++. Это один из первых объектов, размещенных в приложении, он никогда не должен завершаться ошибкой.

Я также обнаружил, что если я включаю параметр «Службы»: разрешить службам взаимодействовать с рабочим столом, то все дочерние процессы запускаются корректно. Однако, do появляются на рабочем столе при подключении через RDP и, к сожалению, прекращаются, если вы выходите из системы через RDP = YUK! Это все еще не идеальное решение - мне бы очень хотелось узнать, почему дочерние процессы не смогли выделить память после 6-го дочернего процесса.

Ответы [ 3 ]

5 голосов
/ 07 сентября 2012

Я надеюсь, что этот ответ кому-нибудь поможет в будущем ... У меня была такая же проблема - приложения работали бы нормально, если бы окнам было разрешено отображать, но зависали при запуске, если работали под службой и не могли взаимодействовать с рабочим столом.,Решение заключается в увеличении размера кучи неинтерактивной станции Windows в реестре, которая на моем компьютере была установлена ​​на 512 КБ, а кучи интерактивной станции Windows была 3072 КБ.

Это можно изменить, перейдя на

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems\Windows

Значение - длинная строка.Вам нужно изменить настройку SharedSection , которая выглядит примерно так:

SharedSection = 1024,3072,512

Второе число - размер интерактивный куча окон станции и последний размер неинтерактивная куча окон станции.Если вы удалите последний номер, то куча интерактивных и неинтерактивных оконных станций будет иметь одинаковый размер.Это то, что я сделал.

Подробности читайте здесь: http://support.microsoft.com/kb/184802

1 голос
/ 22 сентября 2011

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2.

1 голос
/ 22 сентября 2011

Существуют ли какие-то особые ограничения на количество процессов или объем памяти, которые могут использоваться службой, включая процессы, порожденные этой службой ??

Объекты заданий могут использоваться для ограниченияиспользование памяти процессом (или группой процессов), но что-то должно было бы связать рассматриваемые процессы с этим объектом задания.

Нет такого объекта задания для процессов обслуживания.

Подумайте об использовании реестра, чтобы разрешить отладку при запуске затронутых процессов: http://msdn.microsoft.com/en-us/library/a329t4ed.aspx

...