2015-05-26 37 views
10

Widzę dziwny błąd w moim programie obsługi systemu Windows. Mój program serwisowy wywołuje StartServiceCtrlDispatcher() na samym początku main(), ale czasami kończy się niepowodzeniem z 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT).Co powoduje błąd StartServiceCtrlDispatcher() z 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

Wiem, że ten błąd występuje, jeśli użytkownik uruchamia program ręcznie (jako program konsoli). Ale tak nie jest. Dodałem kod, aby sprawdzić macierzysty proces programu serwisowego, gdy wystąpi ten błąd, i informuje on, że services.exe jest procesem nadrzędnym (myślę, że można bezpiecznie założyć, że mój program został poprawnie uruchomiony przez SCM).

Niestety, ten błąd nie reprodukować na moim komputerze dev i nie można debugować go przez siebie, ale dzienniki błędów złapanych na systemach użytkowników mówi:

  • Ten problem wydaje się stać na zaledwie kilka% z wszystkich użytkownicy tego programu.
  • Nawet jeśli problem się pojawia, nie wydaje się, aby się powtórzył. Następnym razem usługa zwykle rozpoczyna się pomyślnie.
  • Gdy ten problem się pojawia, StartServiceCtrlDispatcher() zatrzymuje się na około sekundę, zanim powróci z błędem.

Czy ktoś widział podobny błąd? Jeśli tak, jaka była przyczyna błędu?

+0

Czy dwukrotnie sprawdziłeś, czy wywołujesz StartServiceCtrlDispatcher z głównego wątku, że jest on wywoływany w ciągu kilku sekund od rozpoczęcia procesu i czy tablica SERVICE_ENTRY_TABLE jest poprawna? (W szczególności upewnij się, że końcowy wpis to {NULL, NULL}.) –

+0

Tak, SERVICE_ENTRY_TABLE jest poprawnie zakończony. A jeśli chodzi o czas, zapomniałem wspomnieć w oryginalnym pytaniu, ale po niepowodzeniu funkcji StartServiceCtrlDispatcher() sprawdziłem mój kod sygnatura czasowa i zwykle trwa około jednej sekundy (lub mniej) po rozpoczęciu procesu serwisowego. Tak więc myślę, że jest mało prawdopodobne, że opóźnienie powoduje błąd. –

+0

Bardzo dziwne. Bardzo trudne do debugowania, jeśli nie można zidentyfikować wspólnego czynnika, aby można było odtworzyć problem. Jako potencjalne obejście, może mógłbyś spróbować wywołać StartServiceCtrlDispatcher() po raz drugi, jeśli pierwsze połączenie nie powiedzie się? –

Odpowiedz

6

Jak widać z braku odpowiedzi i czegokolwiek w Google, problem nie jest powszechny. Wierzę, że problem leży w twojej usłudze, I to jest w kodzie wykonanym od początku procesu do StartServiceCtrlDispatcher(), i najprawdopodobniej przybiera on pewną formę uszkodzenia zasobów systemowych, prawdopodobnie sterty lub HANDLE.

Możesz być przykro to słyszeć, ale nie będę miał magicznej odpowiedzi na twoje problemy. Zamiast tego mogę zaproponować rozwiązanie problemu.

Microsoft Application Verifier jest nieoceniony w wykryciu korupcji. Sugeruję, aby:

  1. Zainstaluj go na swoim komputerze.
  2. Dodaj do tego swój serwer usług.
  3. Po raz pierwszy wybierz tylko Basics\Heaps.
  4. Naciśnij Zapisz. Nie ma znaczenia, czy otworzysz weryfikator aplikacji.
  5. Uruchom usługę kilka razy.
  6. Po awarii zawiesza się, a awaria wskaże na problem.
  7. Jeśli się nie zawiesza, dodaj Basics\Handles. W przeciwieństwie do Basics\Heaps, może to czasem wywołać "fałszywe alarmy" - błędy w kodzie, które nie zaszkodzi wiele. W każdym razie, odkąd jesteś na polowaniu, lepiej napraw wszystko, co możesz znaleźć. Martwię się głównie o podwójne uwolnienie HANDLE lub coś w tym stylu. Odblokowanie przez pomyłkę menedżera serwisowego HANDLE z pewnością może doprowadzić do Twojego problemu.
  8. Jeśli nadal nie ulega awarii, możesz spróbować innych opcji w Basics\*, ale nie sądzę, że to pomoże.
  9. W tym momencie możesz chcieć sprawdzić kod pomiędzy programami main() i StartServiceCtrlDispatcher() oraz dowolnymi globalnymi konstruktorami, jakie możesz mieć. Sprawdź potencjalne przepełnienia bufora i błędy z HANDLE.
  10. Następnym krokiem może być zainstalowanie weryfikatora aplikacji na komputerze klienta. Nie ma w tym nic złego, czasami robię to, gdy sam nie mogę znaleźć błędu.
0

WSKAZÓWKA: Użyłem _wfopen/fwrite/fclose do logowania niektórych wiadomości. Jakoś 183 zostało wyrzucone wewnętrznie i doprowadziło do tego błędu 1063. Usunąłem rejestrowanie i zaczęło działać normalnie, ponieważ nic się nie stało. Każdy minutowy błąd może cię do tego doprowadzić. Zacznij od usług i wyświetli błąd płac (w moim przypadku 183).

Powiązane problemy