![]() |
Service debuggen leicht gemacht
Hi Leute
ich ärger mich seit Tagen mit meinem blöden Service rum. Durch log einträge schreiben und dann stunden langes "in den Code starren" kommt man zwar auch auf die Fehler drauf, aber es ist lang nicht so effektiv wie wenn man einfach mit F8 durchgehen kann :mrgreen: Deshalb habe ich mich heute drangemacht dieses zu verbessern und zu meiner großen Verwunderung habe ich es sogar geschafft :-D So genug zur Vorgeschichte nun der Code: Einmal den Project Quellcode auf folgendes ändern:
Delphi-Quellcode:
Dann noch eine kleine Nachrichtenschleife bzw. ein ReadLn damit die Anwendung nicht gleich wieder weg ist:
program Project1;
{$IFDEF DebugEXE} {$APPTYPE CONSOLE} {$ENDIF} uses SvcMgr, Unit1 in 'Unit1.pas' {Service1: TService}; {$R *.RES} {$IFDEF DebugEXE} var TempBool : Boolean; begin Service1 := TService1.Create(nil); try TempBool := false; Service1.ServiceStart(nil, TempBool); if TempBool = false then begin Writeln('!!!Service did not start correct'); Readln; exit; end; Service1.ServiceExecute(nil); TempBool := false; Service1.ServiceStop(nil, TempBool); if TempBool = false then begin Writeln('!!!Service did not stop correct'); Readln; exit; end; finally Service1.Free; end; {$ELSE} begin if not Application.DelayInitialize or Application.Installing then Application.Initialize; Application.CreateForm(TService1, Service1); Application.Run; {$ENDIF} end.
Delphi-Quellcode:
So wenn man jetzt unter den Projektoptionen -> Verzeichnisse/Bedingungen -> Definition den Wert DebugEXE einträgt dann wird es nach dem nächsten kompilieren eine direkt startbare und debugbare Exe heraus. Lässt man die Definition wieder weg wird es wieder ein normaler Service der installiert werden kann.
procedure TService1.ServiceExecute(Sender: TService);
begin {$IFDEF DebugEXE} Readln; {$ELSE} while not Terminated do begin ServiceThread.ProcessRequests(False); sleep(20); end; {$ENDIF} end; So viel Spaß damit :cheers: |
Re: Service debuggen leicht gemacht
Wäre nit Tutorials passender?
|
Re: Service debuggen leicht gemacht
Das hilft leider nicht, wenn der Dienst nicht als normale Anwendung ausgeführt werden kann.
Eines der Probleme ist, dass der SCM standardmäßig Dienste, die 30 Sekunden lang keine Anfragen beantworten, terminiert (inklusive Debugger). Da hilft dann nur noch das Setzen des Timeouts ( ![]() |
Re: Service debuggen leicht gemacht
Zitat:
Habs zur sicherheit nochmal getestet ... meine anwendung läuft ohne irgendwelche eingabe ohne probleme durch. |
Re: Service debuggen leicht gemacht
Zitat:
Wie auch immer, da ich meine Dienste nicht in Delphi entwicklen kann (64-Bit), habe ich mir ohnehin angewöhnt die Funktionalität in eigenen Klassen zu kapseln (der "Dienst" ruft nur noch Start/Stop der Klasse auf) - was es deutlich einfacher macht, die Kommunikation (Pipes) und Funktionalität in einer "normalen" Anwendung zu testen. Wir machen also das Gleiche, nur in einer anderen Sprache ;) Ich wollte nur auf den o.g. Sonderfall und mögliche Lösungen hinweisen (wobei Vista diese "Lösung" durch die Isolation der "interaktiven" Dienste wieder erschwert/verhindert). |
DP-Maintenance
Dieses Thema wurde von "Daniel G" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Tutorials und Kurse" verschoben.
Für die CL etwas zu umfangreich, unter Beachtung von NicoDEs Beiträge verschoben... |
Re: Service debuggen leicht gemacht
Servicemanager muss man ausschließen, aber der Rest funktioniert:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz