web-dev-qa-db-ja.com

StartServiceCtrlDispatcher()が1063(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)で失敗する原因は何ですか?

Windowsサービスプログラムに奇妙なエラーが表示されます。私のサービスプログラムはStartServiceCtrlDispatcher()の最初にmain()を呼び出しますが、1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)で失敗することがあります。

ユーザーが(コンソールプログラムとして)プログラムを手動で起動すると、このエラーが発生します。ただし、そうではありません。このエラーが発生したときに、サービスプログラムの親プロセスをチェックするコードを追加しました、services.exeが親プロセスであることを通知します(私のプログラムがSCMによって適切に起動されたと想定しても安全です)。

残念ながら、このエラーは私の開発マシンでは再現されず、自分でデバッグすることはできませんが、ユーザーシステムでキャプチャされたエラーログは次のように伝えています。

  • この問題は、このプログラムの全ユーザーの数%でのみ発生するようです。
  • 問題が発生しても、繰り返しは発生しないようです。次回サービスは通常正常に開始されます。
  • この問題が発生すると、StartServiceCtrlDispatcher()は約1秒間停止してから失敗して戻ります。

誰かが同様のエラーを見たことがありますか?その場合、エラーの原因は何でしたか?

13
Susumu Arai

回答がないことやgoogleに何かがあることからすでにわかるように、問題は一般的ではありません。問題はあなたのサービスにあると思います、そしてそれはプロセスの最初からStartServiceCtrlDispatcher()まで実行されたコードにあり、そしておそらくそれは何らかの形の破損したシステムリソース、おそらくヒープまたはHANDLEをとります。

あなたはこれを聞いて申し訳ありませんが、私はあなたの問題に魔法の答えをするつもりはありません。代わりに、いくつかのトラブルシューティングを提案できます。

Microsoft Application Verifierは、破損の発見に非常に役立ちます。私はあなたに以下を提案します:

  1. 開発マシンにインストールします。
  2. サービスのexeをそれに追加します。
  3. 初めて_Basics\Heaps_のみを選択します。
  4. 保存を押します。アプリケーション検証ツールを開いたままにしても問題ありません。
  5. サービスを数回実行します。
  6. クラッシュした場合はデバッグしてください。クラッシュすると問題が指摘されます。
  7. クラッシュしない場合は、_Basics\Handles_を追加します。 _Basics\Heaps_とは異なり、これは「誤検知」を引き起こすことがあります。とにかく、あなたは狩りをしているので、見つけたものすべてを修正した方がいいでしょう。私は、HANDLEまたはそのようなものを二重に解放することについて主に心配しています。サービスマネージャHANDLEを誤って解放すると、問題が発生する可能性があります。
  8. それでもクラッシュしない場合は、_Basics\*_の他のオプションを試すことができますが、それが役に立たないと思います。
  9. この時点で、プログラムのmain()StartServiceCtrlDispatcher()の間のコードと、使用できるすべてのグローバルコンストラクターを検査することができます。 HANDLEで潜在的なバッファオーバーフローとエラーを探します。
  10. 次のステップは、Application Verifierをクライアントのマシンにインストールすることです。それほど害はありませんが、自分でエラーを見つけられない場合は、時々それを行います。
7
Codeguard

ヒント:_wfopen/fwrite/fcloseを使用していくつかのメッセージをログに記録しました。どういうわけか183が内部でスローされ、この失敗1063につながっていました。ロギングを削除したところ、何も起こらなかったため、正常に動作し始めました。どんな小さなエラーもそれにあなたを導くかもしれません。サービスから開始すると、賃金エラー(私の場合は183)がリストされます。

0
hidalgo