Usługi Windows (Windows Services) to specjalny rodzaj programów wykonywalnych, który funkcjonuje w tle działania systemu Windows. Usług nie można uruchomić „dwuklikiem”, czy naciśnięciem ENTER (to trochę uproszczenie, ale na potrzeby tego artykułu prawdziwe i wystarczające).
Usługi Windows muszą zostać zarejestrowane w systemie, a następnie można nimi sterować (uruchamiać, zatrzymywać itd.) z poziomu appletu Usługi z Panelu Sterowania lub w module „Zarządzanie komputerem”, odpowiednio w gałęzi usługi (istnieją jeszcze inne narzędzia do sterowania usługami, ale to nie jest w tej chwili istotne).
Aby móc debuggować napisaną samodzielnie w Visual Studio usługę wystarczy:
a) zarejestrować (np. installutil, czy sc) i uruchomić tę usługę (np. aplikacją z Panelu sterowania)
b) ustawić ją w ramach VS jako „Startup project” (ten punkt ma zwłaszcza znaczenie jeżeli nasza usługa jest częścią solution złożonego z kilku projektów – z moich obserwacji wynika, że breakpointy działają tylko jeżeli usługa to Startup Project
c) ustawić w źródłach usługi breakpoint’y, na których chcemy przerywać zwykłe działanie usługi i rozpoczynać jej śledzenie
d) tu uwaga: najważniejszy moment – podłączyć się do działającego EXE’ka usługi debuggerem, przy pomocy polecenia:
Debug|Attach to process…
Następnie w oknie, które się pojawi po wybraniu wymnienionego wyżej polecenia, wskazujemy proces usługi – na poniższym zrzucie wybrana jest przykładowa usługa (nie napisana przeze mnie – to tylko przykład):
Po takim „spięciu” debuggera z działającym procesem, uzyskamy możliwość zatrzymania wykonania usługi i śledzenia jej krok po kroku.
Żeby dało się to zrobić wygodnie, z użyciem źródeł usługi, debugger musi mieć dostęp do odpowiednich informacji (np. pliki PDB). Próby śledzenia usług lub procesów, dla których nie mamy informacji dla debuggera skończą się propozycją „Show Dissasembly” – ale to już materiał na inny wpis.
Zalecić warto także ostrożność przy wyborze usługi, którą będziemy śledzić – wybranie procesu krytycznego dla systemu do debuggowania, może spowodować całkowite zawieszenie systemu. Microsoft poleca np. „attach to process” na WinLogon.exe ;-)