Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Service debuggen - mit Prozess verbinden klappt nicht mehr (https://www.delphipraxis.net/163004-service-debuggen-mit-prozess-verbinden-klappt-nicht-mehr.html)

bwolf 12. Sep 2011 17:38

Service debuggen - mit Prozess verbinden klappt nicht mehr
 
Hallo,

ich habe einen Service geschrieben den ich über eine Host-Anwendung immer erfolreich debuggen konnte.
Heute musste ich eine kleine Änderung vornehmen udn es war mir nicht mehr möglich, mich mit dem Prozess zu verbinden (die IDE schmiert nach dem verbinden immer ab).
Ich habe festgestellt, dass, wenn ich keine Äderung am Service vornehme das Verbinden noch funktioniert. Erst wenn ich eine kleine Änderung gemacht habe, klappt es nicht mehr.

Bin für jeden Tipp dankbar!

grl 12. Sep 2011 18:21

AW: Service debuggen - mit Prozess verbinden klappt nicht mehr
 
Für solche Fälle hab ich mir ein Progrämmchen geklopft, dem ich über WM_COPYDATA Nachrichten schicken kann - damit kann man eigentlich fast immer ein bischen mitloggen was denn grad passiert. Nachteil: Mit Breakpoints und so is dann natürlich essig.

Gruß
Luggi

arnold mueller 12. Sep 2011 19:01

AW: Service debuggen - mit Prozess verbinden klappt nicht mehr
 
Zitat:

Zitat von grl (Beitrag 1123757)
Für solche Fälle hab ich mir ein Progrämmchen geklopft, dem ich über WM_COPYDATA Nachrichten schicken kann - damit kann man eigentlich fast immer ein bischen mitloggen was denn grad passiert

wohl dem der noch XP einsetzen darf ;-)

arnold mueller 12. Sep 2011 19:07

AW: Service debuggen - mit Prozess verbinden klappt nicht mehr
 
Zitat:

Zitat von bwolf (Beitrag 1123738)
(die IDE schmiert nach dem verbinden

Fehlermeldung? Friert ein oder wie? Beschreib doch mal was du genau machst. Wenn ich einen Service debuggen will, setze ich im Konstruktor ein Sleep 10 Sekunden und danach einen Haltepunkt. Innerhalb der 10Sekunden verbinde ich mich mit dem Prozess und steh danach auf dem Haltepunkt und kann debuggen.

rollstuhlfahrer 12. Sep 2011 19:59

AW: Service debuggen - mit Prozess verbinden klappt nicht mehr
 
Ach ja und die IDE als Admin starten.

Bernhard

SvB 12. Sep 2011 22:47

AW: Service debuggen - mit Prozess verbinden klappt nicht mehr
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mir für solche Fälle, ich nenne es mal ein "Framework" gebastelt, das wie folgt aussieht:

Die eigentliche Logik des Service steht in einem Datenmodul, bzw. weiterer Code usw. kann in weitere Datenmodulen ausgelagert, die vom Haupt-Datenmodul aufgerufen werden. Um das Haupt-Datenmodul herum habe ich zwei Projekte gebastelt, das eine, der eigentliche Dienst, das andere das selbe als ganz normale EXE-Datei.

Was bringt mir das? Ich kann meine Logik unabhängig vom Dienst testen. Als ganz normale EXE debuggen usw. Wenn dort alles funktioniert, dann erzeuge ich mein Projekt "Dienst" komplett neu und kann mir sicher sein, dass es funzt.

Zusätzlich habe ich noch ein einfacher Log-Mechanismus eingebaut, der bei der EXE die Infos in ein Memofeld schreibt, beim Dienst ins Windows Ereignisprotokoll.

Ich habe den ganzen Code mal angehängt.

Folgendes ist noch zu beachten:
Ich benutze das unter XE, in wie weit das unter älteren Version klappt muss selbst probiert werden.

In den Projektoptionen für die Test-EXE ist die Bedingung "xEXE" definiert. Damit binde ich im Datenmodul eine Referenz zum EXE-Formualar ein. Im Fall vom Dienst wird dann entsprechend die Hauptunit vom Dienst eingebunden. Durch dies wird die entsprechende "LogMessage" aufgerufen.
Deshalb beachten, dass beim Wechsel von der EXE zum Datenmodul und umgekehrt immer das gesamte Projekt erzeugt wird, damit es damit keine Probleme gibt.

Mit den Indy-Komponenten ist eine Funktion "SendMail" eingebaut. Infos für das Senden werden aus einer Ini-Datei gelesen, die im selben Ordner wie der Dienst abgelegt sein sollte. Wer das nicht braucht, kann das ja rauswerfen.

Wenn jemand MadExcept benutzt, kann in uServiceMain ein "MadExceptionHandler" einfügen und das Ereignis OnException hinzufügen. Meinen auskommentierten Code dann einbinden. Es wird dann die Exceptions ins Windows EreignisLog gespeichert und auch per eMail versendet.

Beim Starten vom Dienst wird jedesmal eine aussagekräftige Beschreibung für den Dienst im Windows abgelegt (Anzeige in der MMC bei den Diensten). Das könnte man auch beim Installieren einmalig machen, da ich aber beim Kunden immer nur die EXE tausche ohne das Ganze wieder komplett zu installieren, mache ich das so und die Beschreibung wird dann auch aktualisiert.

In der Projektdatei der EXE kann ich dann auch "ReportMemoryLeaksOnShutdown" setzen, um zu prüfen, ob ich keine Speicherlöscher eingebaut habe. Wenn da nichts ist, kann man auch sicher sein, dass es im Dienst damit auch keine Probleme gibt.

Viel Spaß beim Anschauen und benutzen. Wer fragen hat, einfach melden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz