2011-09-22 12 views
2

私は、ニーズに応じて他の多くのプロセスを起動するLocalSystemアカウントとしてC#サービスを実行しています。これは数ヶ月間うまくいっています。ちょうど今週、いくつかのサブプロセスがクラッシュしています。私はそれらにリモートデバッガを接続しており、メモリ割当てに失敗しています(C++の新しい演算子は0x0を返します)。これはクラッシュの間接的な原因です。サービスによって起動されたプロセスはメモリを割り当てることができません

面白いことに、マシンにRDPをインストールすれば、CMDからプロセスを簡単に起動できます。しかし、サービスが開始されたときは、何もしません。

マシンはWindows XP SP3を実行しています。コミット料金から物理RAMの約80%が外れるわけではありません。

サービスで使用できるプロセスやメモリの量には、サービスによって生成されたプロセスを含むいくつかの特別な制限がありますか?

これらのプロセスがメモリを割り当てることができないその他のアイデア。

EDIT:

私はSysinternalsのprocmonを持つクラッシュのシナリオをよく見て持っていたし、それは(私が見ることができるということ)は何も明らかにしていません。それは正常になっているように見え、突然クラッシュします。 C++の新しい呼び出しからヌルポインタを逆参照した後にクラッシュしていることをリモートデバッガにアタッチすることで確認できます。これは、アプリケーションに割り当てられた最初のオブジェクトの1つであり、決して失敗することはありません。

サービスオプションを有効にすると、サービスがデスクトップとやりとりすることを許可すると、すべての子プロセスが正しく起動することも発見されました。ただし、RDP経由で接続するとデスクトップに表示されますが、残念ながらRDP = YUK経由でログアウトすると終了します!しかしこれはまだ理想的な解決策ではありません。なぜなら、子プロセスが6番目の子プロセスの後にメモリを割り当てることができなかった理由を本当に知りたいのです。

+0

ポストにこれらのクラッシュからのイベントビューアのエラーメッセージを追加してください。 – harrymc

+0

イベントログ内の唯一のメッセージは、デバッガが読み込みに失敗し、アプリケーションがクラッシュする(アクセスできないアドレスを読み取る)ことです:「MDS_16.exe [456]で未処理のWin32例外が発生しました。次のエラー:ユーザーがログオンしていないためデバッガを起動できませんでした。 詳細については、「ジャストインタイムデバッグ、エラー」のドキュメントインデックスを確認してください。 詳細については、http: ://go.microsoft.com/fwlink/events.asp " –

+0

私が前に述べたように、私はクラッシュするプロセスにリモートデバッグすることができ、C++の新しいコールがnullを返しています。これは逆参照され、クラッシュします。実際の問題は、プロセスが開始するためにメモリを割り当てることができないことです。 –

答えて

5

私は同じ問題を抱えていました.Windowsはレンダリングが許可されていればアプリケーションはうまく動作しますが、サービスの下で実行され、対話することができない場合は起動時にクラッシュしますデスクトップで。解決策は、私のマシンで512KBに設定されていたレジストリの非インタラクティブなウィンドウステーションヒープのサイズを増やすことです。インタラクティブなウィンドウステーションのヒープは3072KBでした。

あなたは値が長い文字列である

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

に行くことによってこれを変更することができます。

のSharedSection = 1024,3072,512

秒数がインタラクティブウィンドウステーションヒープのサイズで、最後の1がのサイズです:あなたはこのようになりますSharedSectionの設定を変更する必要があります非インタラクティブ windows station heap。最後の番号を削除すると、インタラクティブおよび非インタラクティブウィンドウステーションのヒープは同じサイズになります。それが私のしたことです。

ここに詳細を読む:http://support.microsoft.com/kb/184802

+0

私が問題を経験したマシンは、現在死んでいます。私たちは、すでに実行中の別のサービスに機能を組み込むことで、問題を回避しました。 –

1

Are there some special limitations of how many processes or how much memory can be used by a service, including processes spawned by that service??

ジョブオブジェクトは、(プロセスのまたはグループ)プロセスのメモリ使用量を制限するために使用することができますが、何かがそのジョブオブジェクトとの質問にプロセスを関連付ける必要があります。

サービスプロセスのジョブオブジェクトはありません。

はあなたが影響を受けたプロセスの起動からデバッグできるようにするために、レジストリを使用することを検討してください: http://msdn.microsoft.com/en-us/library/a329t4ed.aspx

+0

これはリモートマシンであるため、JITを使用して自動的にデバッグする環境を設定することはできません。さらに、プロセスはLocalSystemとして実行されます。ユーザーはコンソールがないため、JITデバッガは起動できません。私はすでにアプリケーションにリモートデバッガを接続することができましたが、NULLを返すC++ new演算子でメモリを割り当てられないことがわかります。したがって、この問題の原因となる可能性のあるメモリ制限についての質問。 –

1

あなたのプロセスで何が起こっているかを確認するのSysInterals Procmonが役立つかもしれません。

+0

プロセスがクラッシュしている間、私はProcmonをよく見ていました。私はそれがメモリを割り当てることができない理由を指摘するものは何も見ません。 DLLのロードとレジストリのクエリがたくさんあります。次に、jitデバッガのロードを開始します。これは、失敗したメモリ割り当てからのヌルポインタの逆参照によるクラッシュに対応しています。 :( –

関連する問題