2015-05-26 71 views
10

我看到奇怪的錯誤與我的Windows服務程序。我的服務程序在其main()的最開始處呼叫StartServiceCtrlDispatcher(),但它有時會因1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)而失敗。是什麼導致Star​​tServiceCtrlDispatcher()失敗並返回1063(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

我知道的是,如果用戶手動啓動程序(作爲控制檯程序)發生此錯誤。但事實並非如此。我添加了一個代碼來檢查發生此錯誤時服務程序的父進程,它告訴services.exe是父進程(我認爲可以安全地假定我的程序已由SCM正確啓動)。

不幸的是,這個錯誤不會重現我的開發機器上,不能由自己調試,而是在用戶系統中捕獲的錯誤日誌講述:

  • 這個問題似乎只在所有的幾個百分點的情況發生這個程序的用戶。
  • 即使問題發生,似乎也沒有重複。下次該服務通常會成功啓動。
  • 發生此問題時,StartServiceCtrlDispatcher()在返回失敗之前停頓約一秒。

有沒有人見過類似的錯誤?如果是這樣,錯誤的原因是什麼?

+0

您是否仔細檢查過您是否從主線程調用StartServiceCtrlDispatcher,是否在啓動過程的幾秒鐘內調用StartServiceCtrlDispatcher,以及SERVICE_ENTRY_TABLE數組是否正確? (特別是確保最終條目是{NULL,NULL}。) –

+0

是的,SERVICE_ENTRY_TABLE被正確終止。並且,關於時間,我忘了在我原來的問題中提到,但是在StartServiceCtrlDispatcher()失敗後,我的代碼被檢查時間戳,通常在服務過程開始後大約一秒鐘(或更短)。所以,我認爲延遲不太可能導致錯誤。 –

+0

很奇怪。如果你不能識別一個共同的因素,那麼你很難調試,因此你可以重現問題。作爲一種可能的解決方法,如果第一次調用失敗,也許可以再次嘗試調用StartServiceCtrlDispatcher()。 –

回答

6

正如你可以從谷歌上沒有答案和任何東西所看到的那樣,這個問題並不常見。我認爲問題在於您的服務,而且它在代碼執行過程中從開始到StartServiceCtrlDispatcher(),並且很可能需要某種形式的損壞系統資源,可能是堆或HANDLE的。

你可能很遺憾聽到這個消息,但我不會對你的問題有個神奇的答案。相反,我可以提出一些疑難解答。

Microsoft應用程序驗證程序在查找損壞方面具有無法估量的價值。我建議你:

  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安裝到客戶機器。沒有太大的傷害,我有時會在我自己找不到錯誤時執行此操作。
0

提示:我用_wfopen/fwrite/fclose記錄了一些消息。不知怎的,183被內部拋出,並導致了這種失敗1063.我刪除了日誌記錄,並且沒有發生任何事情,它開始正常工作。任何微小的錯誤都可能導致你。從服務開始,它會列出工資錯誤(在我的情況下爲183)。

相關問題