Czy istnieje prostszy sposób na przejście przez kod niż uruchomienie usługi za pomocą Menedżera kontroli usług systemu Windows, a następnie dołączenie debugera do wątku? To trochę kłopotliwe i zastanawiam się, czy istnieje bardziej proste podejście.
c#
debugging
windows-services
Matthias
źródło
źródło
Odpowiedzi:
Jeśli chcę szybko debugować usługę, po prostu wpadam
Debugger.Break()
tam. Kiedy ta linia zostanie osiągnięta, przeniesie mnie z powrotem do VS. Nie zapomnij usunąć tej linii, gdy skończysz.AKTUALIZACJA: Alternatywnie do
#if DEBUG
pragmatów możesz także użyćConditional("DEBUG_SERVICE")
atrybutu.Na swoim komputerze
OnStart
po prostu wywołaj tę metodę:Tam kod będzie włączony tylko podczas kompilacji debugowania. Na razie przydatne może być utworzenie osobnej konfiguracji kompilacji do debugowania usługi.
źródło
Myślę też, że posiadanie osobnej „wersji” do normalnego wykonywania i jako usługa jest właściwą drogą, ale czy naprawdę jest to konieczne, aby dedykować do tego celu oddzielny przełącznik wiersza poleceń?
Czy nie możesz po prostu zrobić:
Miałoby to tę zaletę, że można po prostu uruchomić aplikację za pomocą dwukrotnego kliknięcia (OK, jeśli naprawdę tego potrzebujesz) i że możesz po prostu nacisnąć F5Visual Studio (bez potrzeby modyfikowania ustawień projektu, aby uwzględnić tę
/console
opcję).Z technicznego punktu widzenia
Environment.UserInteractive
sprawdza, czyWSF_VISIBLE
flaga jest ustawiona dla bieżącej stacji okien, ale czy jest jakiś inny powód, dla którego wróciłabyfalse
, poza uruchomieniem jej jako (nieinteraktywna) usługa?źródło
System.Diagnostics.Debugger.IsAttached
zamiast tegoEnvironment.UserInteractive
.Kiedy kilka tygodni temu założyłem nowy projekt serwisowy, znalazłem ten post. Chociaż istnieje wiele świetnych sugestii, nadal nie znalazłem rozwiązania, które chciałem: możliwość wywoływania klas usług
OnStart
iOnStop
metod bez żadnych modyfikacji klas usług.Rozwiązanie, które wymyśliłem, wykorzystuje
Environment.Interactive
wybrany tryb uruchamiania, jak sugerują inne odpowiedzi na ten post.RunInteractive
Pomocnik wykorzystuje odbicia zadzwonić chronionychOnStart
iOnStop
metod:To jest cały wymagany kod, ale napisałem też przewodnik z objaśnieniami.
źródło
walk through
), to upewnić się, że przejdziesz do właściwości projektu i zmienisz typ danych wyjściowych,Console Application
zanim spróbujesz skompilować i uruchomić. Znajdź to naProject Properties -> Application -> Output type -> Console Application
. Ponadto, aby działało to poprawnie dla mnie, musiałem uruchomić aplikację za pomocąstart
polecenia. Np .:C:\"my app name.exe" -service
nie działałoby dla mnie. Zamiast tego użyłemC:\start /wait "" "my app name.exe" -service
Czasami ważna jest analiza tego, co dzieje się podczas uruchamiania usługi. Dołączanie do procesu nie pomaga tutaj, ponieważ nie jesteś wystarczająco szybki, aby dołączyć debugger podczas uruchamiania usługi.
Krótka odpowiedź brzmi: używam do tego następujących 4 linii kodu :
Są one wstawiane do
OnStart
metody usługi w następujący sposób:Dla tych, którzy wcześniej tego nie robili, poniżej zamieściłem szczegółowe wskazówki , ponieważ możesz łatwo utknąć. Poniższe wskazówki odnoszą się do systemu Windows 7x64 i Visual Studio 2010 Team Edition , ale powinny obowiązywać również w innych środowiskach.
Ważne: Wdróż usługę w trybie „ręcznym” (za pomocą
InstallUtil
narzędzia z wiersza polecenia VS lub uruchom przygotowany projekt instalatora usługi). Otwórz program Visual Studio przed uruchomieniem usługi i załaduj rozwiązanie zawierające kod źródłowy usługi - skonfiguruj dodatkowe punkty przerwania zgodnie z wymaganiami w programie Visual Studio - a następnie uruchom usługę za pomocą panelu sterowania usługi.Z powodu
Debugger.Launch
kodu spowoduje to wyświetlenie okna dialogowego „Wystąpił nieobsługiwany wyjątek Microsoft .NET Framework w pliku Servicename.exe ”. pojawić się. Kliknij, jak pokazano na zrzucie ekranu: Yes, debug Servicename.exeNastępnie, szczególnie w UAC systemu Windows 7, może pojawić się monit o podanie poświadczeń administratora. Wpisz je i kontynuuj Yes:
Następnie pojawi się dobrze znane okno debugera Visual Studio Just-In-Time . Pyta, czy chcesz debugować przy użyciu usuniętego debugera. Zanim klikniesz Yes, zaznaczyć, że nie chcą, aby otworzyć nową instancję (2 opcja) - nowa instancja nie będzie tu pomocny, ponieważ nie będzie wyświetlony kod źródłowy. Zamiast tego wybierasz wcześniej otwartą instancję programu Visual Studio:
Po kliknięciu Yes, po chwili Visual Studio pojawi się żółta strzałka prawo w wierszu, w którym
Debugger.Launch
oświadczenie to i jesteś w stanie do debugowania kodu (metodaMyInitOnStart
, która zawiera swój inicjalizacji).Naciśnięcie F5kontynuuje wykonywanie natychmiast, dopóki nie zostanie osiągnięty następny przygotowany punkt przerwania.
Wskazówka: Aby usługa działała, wybierz Debuguj -> Odłącz wszystko . Umożliwia to uruchomienie klienta komunikującego się z usługą po prawidłowym uruchomieniu i zakończeniu debugowania kodu startowego. Jeśli naciśniesz Shift+F5 (zatrzymaj debugowanie), spowoduje to zakończenie usługi. Zamiast tego należy użyć panelu sterowania usługami, aby go zatrzymać.
Zauważ, że
Jeśli budować wydania, a następnie kod debugowania jest automatycznie usuwany , a usługa działa normalnie.
Używam
Debugger.Launch()
, który uruchamia i dołącza debugger . TestowałemDebugger.Break()
również, co nie zadziałało , ponieważ nie ma jeszcze podłączonego debugera podczas uruchamiania usługi (powodując „Błąd 1067: Proces został nieoczekiwanie zakończony” ).RequestAdditionalTime
ustawia dłuższy czas oczekiwania na uruchomienie usługi ( nie opóźnia samego kodu, ale natychmiast kontynuujeDebugger.Launch
instrukcję). W przeciwnym razie domyślny limit czasu uruchomienia usługi jest zbyt krótki, a uruchomienie usługi kończy się niepowodzeniem, jeśli nie zadzwoniszbase.Onstart(args)
wystarczająco szybko z debuggera. Praktycznie przekroczenie limitu czasu wynoszące 10 minut pozwala uniknąć wyświetlenia komunikatu „ usługa nie odpowiedziała ...” natychmiast po uruchomieniu debugera.Gdy się przyzwyczaisz, ta metoda jest bardzo łatwa, ponieważ wymaga tylko dodania 4 linii do istniejącego kodu usługi, co pozwala szybko uzyskać kontrolę i debugować.
źródło
base.RequestAdditionalTime(600000)
zapobiegnie zakończeniu usługi przez kontrolę usługi na 10 minut, jeśli nie zadzwonibase.OnStart(args)
w tym czasie). Poza tym pamiętam, że UAC przerwie również, jeśli po pewnym czasie nie wprowadzisz poświadczeń administratora (nie wiem dokładnie, ile sekund, ale myślę, że musisz go wprowadzić w ciągu minuty, w przeciwnym razie UAC przerwie) , co zakończy sesję debugowania.To, co zwykle robię, to umieszczenie logiki usługi w osobnej klasie i rozpoczęcie od klasy „biegacza”. Ta klasa runner może być faktyczną usługą lub tylko aplikacją konsoli. Twoje rozwiązanie ma (co najmniej) 3 projekty:
źródło
Ten film Fabio Scopela z YouTube wyjaśnia, jak całkiem ładnie debugować usługę Windows ... rzeczywista metoda wykonania tego zaczyna się o 4:45 w filmie ...
Oto kod wyjaśniony w filmie ... w pliku Program.cs dodaj elementy do sekcji Debuguj ...
W pliku Service1.cs dodaj metodę OnDebug () ...
Zasadniczo musisz utworzyć,
public void OnDebug()
który wywołuje,OnStart(string[] args)
ponieważ jest chroniony i niedostępny na zewnątrz.void Main()
Program dodaje się#if
preprocesora z#DEBUG
.Program Visual Studio określa,
DEBUG
czy projekt jest kompilowany w trybie debugowania. Pozwoli to na uruchomienie sekcji debugowania (poniżej), gdy warunek jest spełnionyBędzie działał jak aplikacja konsoli, gdy wszystko pójdzie dobrze, możesz zmienić tryb,
Release
a zwykłaelse
sekcja uruchomi logikęźródło
AKTUALIZACJA
To podejście jest zdecydowanie najłatwiejsze:
http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx
Pierwszą odpowiedź zostawiam poniżej dla potomności.
Moje usługi zwykle mają klasę, która obudowuje Timer, ponieważ chcę, aby usługa regularnie sprawdzała, czy jest jakaś praca do wykonania.
Odnawiamy klasę i wywołujemy StartEventLoop () podczas uruchamiania usługi. (Tej klasy można łatwo użyć również z aplikacji konsoli).
Przyjemnym efektem ubocznym tego projektu jest to, że argumenty, przy pomocy których konfigurujesz Timer, mogą mieć opóźnienie, zanim usługa faktycznie zacznie działać, abyś miał czas na ręczne podłączenie debuggera.
Robiłem też następujące (już wspomniane w poprzednich odpowiedziach, ale z flagami kompilatora warunkowego [#if], aby uniknąć uruchamiania się w kompilacji wydania).
Przestałem to robić w ten sposób, ponieważ czasami zapominaliśmy o wbudowaniu w Release i mieliśmy przerwę w debugowaniu w aplikacji działającej na demie klienta (zawstydzające!).
źródło
// do something
zajmie więcej niż 30 minut?źródło
OnStart
jestprotected
i nie można modyfikować poziomu dostępu :(Możesz także uruchomić usługę za pomocą wiersza polecenia (sc.exe).
Osobiście uruchomiłbym ten kod jako samodzielny program w fazie debugowania, a kiedy większość błędów zostanie usunięta, przejdź do uruchamiania jako usługa.
źródło
Zwykłem mieć przełącznik linii poleceń, który uruchamiałby program albo jako usługę, albo jako zwykłą aplikację. Następnie w moim IDE ustawiłbym przełącznik, aby móc przejść przez mój kod.
W przypadku niektórych języków można faktycznie wykryć, czy działa on w środowisku IDE, i wykonać tę zmianę automatycznie.
Jakiego języka używasz?
źródło
Użyj biblioteki TopShelf .
Utwórz aplikację konsoli, a następnie skonfiguruj konfigurację w swoim Main
Aby debugować swoją usługę, po prostu naciśnij F5 w studiu wizualnym.
Aby zainstalować usługę, wpisz polecenie cmd „console.exe install”
Następnie można uruchomić i zatrzymać usługę w menedżerze usług systemu Windows.
źródło
Myślę, że to zależy od używanego systemu operacyjnego. Vista jest znacznie trudniejsza do przyłączenia się do usług z powodu rozdzielenia sesji.
Dwie opcje, z których korzystałem w przeszłości to:
Mam nadzieję że to pomoże.
źródło
Lubię móc debugować każdy aspekt mojej usługi, w tym każdą inicjalizację w OnStart (), jednocześnie wykonując ją przy zachowaniu pełnej usługi w ramach SCM ... bez trybu „konsoli” lub „aplikacji”.
Robię to, tworząc drugą usługę w tym samym projekcie, która ma być używana do debugowania. Usługa debugowania, uruchomiona jak zwykle (tj. We wtyczce MMC usług), tworzy proces hosta usługi. Daje to proces dołączania debugera, nawet jeśli jeszcze nie uruchomiłeś swojej prawdziwej usługi. Po dołączeniu debugera do procesu uruchom swoją prawdziwą usługę i możesz włamać się do niej w dowolnym miejscu w cyklu życia usługi, w tym OnStart ().
Ponieważ wymaga bardzo minimalnego włamania do kodu, usługa debugowania może łatwo zostać włączona do projektu konfiguracji usługi i łatwo można ją usunąć z wersji produkcyjnej, komentując jeden wiersz kodu i usuwając instalator jednego projektu.
Detale:
1) Zakładając, że wdrażasz
MyService
, również stwórzMyServiceDebug
. Dodaj oba doServiceBase
tablicy w następującyProgram.cs
sposób:2) Dodaj prawdziwą usługę ORAZ usługę debugowania do instalatora projektu dla projektu usługi:
Obie usługi (rzeczywista i debugowana) zostają uwzględnione po dodaniu danych wyjściowych projektu usługi do projektu instalacji dla usługi. Po instalacji obie usługi pojawią się we wtyczce MMC service.msc.
3) Uruchom usługę debugowania w MMC.
4) W Visual Studio dołącz debugger do procesu rozpoczętego przez usługę debugowania.
5) Uruchom prawdziwą usługę i ciesz się debugowaniem.
źródło
Kiedy piszę usługę, umieszczam całą logikę usługi w projekcie dll i tworzę dwa „hosty”, które wywołują tę bibliotekę dll, jeden to usługa Windows, a drugi to aplikacja wiersza poleceń.
Używam aplikacji z wiersza poleceń do debugowania i dołączam debugera do prawdziwej usługi tylko dla błędów, których nie mogę odtworzyć w aplikacji z wiersza poleceń.
Używam tego podejścia, pamiętaj tylko, że musisz przetestować cały kod podczas pracy w prawdziwej usłudze, podczas gdy narzędzie wiersza poleceń jest niezłą pomocą przy debugowaniu, to jest inne środowisko i nie zachowuje się dokładnie tak, jak prawdziwa usługa.
źródło
Podczas opracowywania i debugowania usługi Windows zazwyczaj uruchamiam ją jako aplikację konsolową, dodając parametr startowy / console i sprawdzając to. Ułatwia życie.
źródło
Co powiesz na Debugger.Break () w pierwszym wierszu?
źródło
Aby debugować usługi Windows, łączę GFlagi i plik .reg utworzony przez regedit.
Lub zapisz następujące fragmenty i zamień servicename.exe na żądaną nazwę pliku wykonywalnego.
debugon.reg:
debugoff.reg:
źródło
W przypadku rutynowego programowania małych rzeczy zrobiłem bardzo prostą sztuczkę, aby łatwo debugować moją usługę:
Na początku usługi sprawdzam parametr wiersza polecenia „/ debug”. Jeśli usługa jest wywoływana z tym parametrem, nie wykonuję zwykłego uruchamiania usługi, ale zamiast tego uruchamiam wszystkie nasłuchiwania i po prostu wyświetlam komunikat „Trwa debugowanie, naciśnij OK, aby zakończyć”.
Więc jeśli moja usługa zostanie uruchomiona w zwykły sposób, uruchomi się jako usługa, jeśli zostanie uruchomiona z parametrem / debugowaniem w wierszu poleceń, będzie działać jak normalny program.
W VS dodam / debuguję jako parametr debugowania i bezpośrednio uruchomię program serwisowy.
W ten sposób mogę łatwo debugować większość małych problemów. Oczywiście niektóre rzeczy nadal będą wymagały debugowania jako usługi, ale dla 99% jest to wystarczająco dobre.
źródło
źródło
Używam wariantu odpowiedzi JOP. Za pomocą parametrów wiersza poleceń można ustawić tryb debugowania w środowisku IDE z właściwościami projektu lub za pomocą menedżera usług systemu Windows.
źródło
Aby rozwiązać problemy z istniejącym programem usługi Windows, użyj „Debugger.Break ()”, jak sugerowali inni faceci.
W przypadku nowego programu usługi systemu Windows sugerowałbym użycie metody Jamesa Michaela Hare'a http://geekswithblogs.net/BlackRabbitCoder/archive/2011/03/01/c-toolbox-debug-able-self-installable-windows-service-template- redux.aspx
źródło
Wystarczy umieścić lunch debuggera w dowolnym miejscu i dołączyć program Visualstudio podczas uruchamiania
Musisz także uruchomić VS jako administrator i zezwolić, aby proces mógł być automatycznie debugowany przez innego użytkownika (jak wyjaśniono tutaj ):
źródło
Użyj projektu szablonu usługi C # systemu Windows, aby utworzyć nową aplikację usługi https://github.com/HarpyWar/windows-service-template
Automatycznie wykrywany jest tryb konsoli / usługi, automatyczny instalator / deinstalator usługi oraz kilka najczęściej używanych funkcji.
źródło
Oto prosta metoda, której użyłem do przetestowania usługi, bez żadnych dodatkowych metod „debugowania” i ze zintegrowanymi testami jednostek VS.
źródło
źródło
Dostępne są dwie opcje debugowania.
Proszę odnieść się to na blogu, który został utworzony na ten temat.
źródło
Po prostu wklej
gdziekolwiek w twoim kodzie.
Na przykład ,
Uderzy
Debugger.Break();
po uruchomieniu programu.źródło
Najlepszą opcją jest użycie przestrzeni nazw „ System.Diagnostics ”.
Załącz kod, jeśli jeszcze zablokuj tryb debugowania i zwalniania, jak pokazano poniżej, aby przełączać się między trybem debugowania i zwalniania w Visual Studio,
źródło