2016-04-29 11 views
2

私たちはC++で書かれたサービスをCLIでいくつかのコードで.NETに持っています。データ駆動型のメモリをオーバーライドするサードパーティのライブラリがあるため、メイン処理コードを次のように利用される別々のコードパスに取り除く必要がありました。特定のコマンドラインパラメータでサービスEXEを実行する場合、サービス全体をコンソールアプリケーションとして実行するか、サービスパーツをバイパスするか、または処理のみを行うコンソールアプリケーションとして実行できます。主な操作モードでは、サービスは正常に開始され、createprocessを使用して独自の実行可能ファイルをコマンドラインパラメータで開始します。このコマンドラインパラメータは、サービスの初期化をスキップし、処理部分に負担をかけます。その後、サービススレッドは子プロセスが終了するのを待って、必要に応じてこのプロセスを繰り返します。プロセスの再作成を停止させる原因は何ですか?

私たちが経験している問題は、1700の子プロセスが実行された後に、サービスがそれ自身のコマンドラインバージョンを起動できないことです。十分に不運な場合、サービスも再開を拒否します。サービスが再起動を拒否した場合、メモリ内に関連プロセスは存在しません。サービスが失敗した後にコマンドラインモードでサービスを実行すると、それは失敗するまで子プロセスのさらに1700回の実行を続けます。サービス/コマンドラインプロセスの作業を復元するには、システムを再起動する必要があります。私たちはまた、エラー322を取得しています - "ターゲットデバイスは、操作を完了するには不十分なリソースがあります。イベントログに記録します。子プロセスと親プロセスを1つのユニットにグループ化したJobカーネルオブジェクトがすでに削除されているため、親プロセスを終了すると子プロセスも終了します。これにより、1700の制限が数千増加しました。

Windowsがプロセスが実行されたことを覚えていて、プロセスを再実行したときにそのプロセスにペナルティを課す理由はありますか?異なるデスクトップ下で実行されるプロセスやユーザーは、この問題に関して個別のプロセスとして扱われるようです。サービスが失敗すると、コマンドラインのバージョンを実行することができ、しばらくの間動作します。これはデスクトップのヒープと関係がありますか?同時に2つ以上のプロセスを同時にメモリに格納することはありません。特定のデスクトップ/ユーザーのもとで次回に実行されるときに、どのタイプのウィンドウ機能がプロセスに永続的な影響を与えることができますか?

+1

デスクトップヒープで共有しました。 http://geekswithblogs.net/akraus1/archive/2014/02/04/155370.aspxを参照してください。おそらく、デスクトップヒープ割り当てオブジェクトもリークしています。 Registerwindowmessageは見応えがあります。 –

答えて

3

親プロセスと子プロセスの間で共有されているカーネルリソースが漏れているように聞こえます。おそらく、子プロセスを起動するたびに、親プロセスはいくつかのリソースへのハンドルを作成し、子プロセスに渡します(共有)。子プロセスはそれを閉じることを期待しますが、必要に応じて閉じません。

SysInternalsユーティリティは、これを診断するのに役立ちます。 HandleEx、またはプロセスエクスプローラを起動し、Process Monitorで調べます。

+1

Windowsやウィンドウのメッセージ登録などのオブジェクトに割り当てられたデスクトップヒープは、通常これらのツールでは見えません。現在のデスクトップヒープを監視するにはカーネルデバッガを使用する必要があります。また、dheapmonのようなカーネルドライバをインジェクトする必要があります。http://blog.airesoft.co.uk/2009/10/desktop-heap-monitor-vista-7/ –

+0

@ AloisKraus:このコンテキストでデスクトップヒープオブジェクトであるとは思われません。親がデスクトップヒープオブジェクトを子単位で作成する理由はなく、子が作成したものは通常どおりにクリーンアップする必要があります。チェックする価値はありますが、最初にカーネルオブジェクトをチェックします。 –

関連する問題