Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TService debuggen (https://www.delphipraxis.net/103224-tservice-debuggen.html)

FrankBrin 12. Nov 2007 15:57


TService debuggen
 
Hallole,
hab da mal ne prinzipielle Frage zu Diensten und deren Fehlersuche.

Ich habe um Erfahrungen zu sammeln erst einmal einen minimalistischen Service geschrieben.

Dieser Service ist genau so aufgebaut, wie es überall beschrieben wird. Jedoch habe ich irgendwo einen Fehler.

So und jetz die Frage: Wie debugge ich einen Service?
Den Hinweis "Mit Prozess verbinden" habe ich schon gefunden, aber mit was für einem Prozess?

Kann mir jemand die ganze Geschichte verraten. Was passiert beim Prozess verbinden?

Fragen nix als Fragen!

Wer kann helfen?

Gruss
Frank :wiejetzt:

shmia 12. Nov 2007 17:15

Re: TService debuggen
 
Du kannst in deinem Service die procedure OutputDebugString() verwenden und mit dem Programm
DebugView auffangen.

FrankBrin 13. Nov 2007 06:23

Re: TService debuggen
 
Hallo, soll das heißen, man kann einen Service nicht mit dem normalen Debugger durchforsten?

Das glaub ich nicht so ganz!

Gruß
Frank

Bernhard Geyer 13. Nov 2007 06:31

Re: TService debuggen
 
Zitat:

Zitat von FrankBrin
So und jetz die Frage: Wie debugge ich einen Service?
Den Hinweis "Mit Prozess verbinden" habe ich schon gefunden, aber mit was für einem Prozess?

Na mit deinem Prozess. :) Evtl. noch den Haken "Alle Prozesse Anzeigen" anwählen da dein Prozess unter dem Dienstekonto läuft und sonst nicht sichtbar ist.

Zitat:

Zitat von FrankBrin
Kann mir jemand die ganze Geschichte verraten. Was passiert beim Prozess verbinden?

Das gleiche wie beim normalen Debugging auch. Jedoch wird der entsprechende Debug-Hook nicht beim Prozessstart gesetzt sondern erst später.

FrankBrin 13. Nov 2007 06:42

Re: TService debuggen
 
Hallo Bernhard,
ja genau das ist der Grund meiner Frage. Unter "Mit Prozess verbinden" erscheint mein Service nicht (Häkchen sind alle gesetzt).
Muß der Service vorher installiert sein?
...
Was mir gerade auffällt: Muß die EXE auf dem lokalen Rechner liegen? Die liegt bei mir nämlich auf einem Serverlaufwerk.

mkinzler 13. Nov 2007 06:43

Re: TService debuggen
 
Man kann sich nur mit Prozessen verbinden, welche monentan laufen. der Speicherort ist egal.

Bernhard Geyer 13. Nov 2007 07:40

Re: TService debuggen
 
Zitat:

Zitat von FrankBrin
Hallo Bernhard,
ja genau das ist der Grund meiner Frage. Unter "Mit Prozess verbinden" erscheint mein Service nicht (Häkchen sind alle gesetzt).
Muß der Service vorher installiert sein?

Schon. Wie soll er denn sonst als Dienst laufen?

Zitat:

Zitat von FrankBrin
Was mir gerade auffällt: Muß die EXE auf dem lokalen Rechner liegen? Die liegt bei mir nämlich auf einem Serverlaufwerk.

Läuft der Dienst wohl auf einem anderen Rechner oder liegt die Datei auf einem Serverlaufwerk? Das erste läst sich mit dem Remote Debugger lösen, das zweite ist ein No-Go. Die Exe eines Dienstes muss auf einem lokalen Rechnerlaufwerk liegen ansonsten wird die Sicherheitsverwaltung von Windows dir gehörig in die Suppe spucken (Dienst nicht startbar, da Netzwerklaufwerke niemals die nötige Vertrauensstellung erreichen können wie ein lokales Laufwerk)

ralfiii 13. Nov 2007 09:47

Re: TService debuggen
 
Zitat:

Zitat von mkinzler
Man kann sich nur mit Prozessen verbinden, welche monentan laufen. der Speicherort ist egal.

Ich vermute mal unter Vista wird das nicht mehr funktionieren wenn die UAC eingeschalten ist.
(weil Prozesse mit unterschiedlicher Berechtigung nicht mehr miteinander "können".

In dem Fall wird man die UAC abdrehen müssen.

OregonGhost 13. Nov 2007 11:53

Re: TService debuggen
 
Man kann auch mit aktivierter UAC problemlos Dienste debuggen. Zumindest mit Visual Studio 2005 (das ja ohnehin mit Admin-Rechten laufen muss) geht das wunderbar. Was du meinst, ist, dass ein Prozess nicht mehr ohne weiteres mit einem Prozess mit höheren Rechten kommunizieren kann.

Edit: Du kannst einen Dienst davon abgesehen auch so programmieren, dass man ihn als normale Anwendung starten und debuggen kann. Solange es um die normale Laufzeitfunktionalität geht (also nicht um dienstspezifische Dinge oder das Dienstaufstartverhalten), ist das auch ein gangbarer Weg.

mkinzler 13. Nov 2007 12:01

Re: TService debuggen
 
die IDE muss unter vista ja auch als administrator gestartet werden, sonst funktioniert sie imho nicht richtig.

Phoenix 13. Nov 2007 12:06

Re: TService debuggen
 
Es macht ggf. Sinn, die TService-Klasse etwas aufzubohren.
Ich arbeite schon länger mit Diensten, die sich nicht nur als Service, sondern zusätzlich auch als Kommandozeilen-Programm starten lassen. Damit lässt sich sowas einwandfrei aus der IDE heraus debuggen, ohne den Dienst zu installieren und als Dienst zu starten.

ralfiii 13. Nov 2007 12:31

Re: TService debuggen
 
Zitat:

Zitat von Phoenix
Es macht ggf. Sinn, die TService-Klasse etwas aufzubohren.
Ich arbeite schon länger mit Diensten, die sich nicht nur als Service, sondern zusätzlich auch als Kommandozeilen-Programm starten lassen. Damit lässt sich sowas einwandfrei aus der IDE heraus debuggen, ohne den Dienst zu installieren und als Dienst zu starten.

Klingt interessant.
Magst ein bisserl mehr darüber erzählen?

Phoenix 13. Nov 2007 12:51

Re: TService debuggen
 
Ich befürchte, da das (leider) nicht auf meinem Mist gewachsen ist, dass ich da nicht viel drüber sagen darf.

Bernhard Geyer 13. Nov 2007 13:03

Re: TService debuggen
 
ich würde es so machen:

Alle Programmlogik in eigene Klasse zusammenfassen und einmal in ein Service-Anwendung integrieren und einmal in eine normale Anwendung.

ralfiii 13. Nov 2007 13:11

Re: TService debuggen
 
Zitat:

Zitat von Bernhard Geyer
Alle Programmlogik in eigene Klasse zusammenfassen und einmal in ein Service-Anwendung integrieren und einmal in eine normale Anwendung.

So mach ich das auch gegenwärtig, aber wenn man TService aufbohren könnte (oder so) dass man noch leichter ein .Exe und/oder ein Service hat - das wär schon was.

Bernhard Geyer 13. Nov 2007 13:15

Re: TService debuggen
 
Zitat:

Zitat von ralfiii
Zitat:

Zitat von Bernhard Geyer
Alle Programmlogik in eigene Klasse zusammenfassen und einmal in ein Service-Anwendung integrieren und einmal in eine normale Anwendung.

So mach ich das auch gegenwärtig, aber wenn man TService aufbohren könnte (oder so) dass man noch leichter ein .Exe und/oder ein Service hat - das wär schon was.

Haben sowas ähnliches, jedoch aufgrund der Nachteile (NT-Dienst und interaktion mit Desktop, Erhöhte Probleme mit Vista) werden wir das in der nächsten Version der Applikation wieder zurücknehmen und schön ein App als Dienst haben und eine App als GUI-Oberfläche die mit dem Dienst per TCP/Name Pipes oder was auch sonst kommuniziert.

Codewalker 23. Nov 2009 11:51

Re: TService debuggen
 
Zitat:

Zitat von Phoenix
Es macht ggf. Sinn, die TService-Klasse etwas aufzubohren.
Ich arbeite schon länger mit Diensten, die sich nicht nur als Service, sondern zusätzlich auch als Kommandozeilen-Programm starten lassen. Damit lässt sich sowas einwandfrei aus der IDE heraus debuggen, ohne den Dienst zu installieren und als Dienst zu starten.

Zitat:

Zitat von Phoenix
Ich befürchte, da das (leider) nicht auf meinem Mist gewachsen ist, dass ich da nicht viel drüber sagen darf.

Eigentlich schade. Aber ich habe eine augenscheinlich funktionierende Variante per Zufall entdeckt. Dazu muss man nichtmal TService aufbohren, sondern einfach in die Projektdatei
Delphi-Quellcode:
  {$APPTYPE CONSOLE}
hinzufügen. Schon bekommt man automatisch eine Konsole und damit einen Prozess geliefert. Man kann mit Writeln('TEXT'); sehr einfach Meldungen ausgeben und auch das Debuggen klappt super. Man muss nur das ganze wieder auskommentieren, wenn man den Service irgendwann als Dienst nutzen will ohne das ganze Debugging drum herum. Es wäre daher sehr hilfreich, die Debug-Ausgaben über eine Hilfsfunktion zu kapseln. Dabei kann man sich selber noch ein DEFINE bauen oder einfach auf einen Debugger prüfen:

Delphi-Quellcode:
procedure WriteConsole(Text: String);
begin
 If DebugHook <> 0
  then Writeln(Text);
end;
oder wenn man sich neben {$APPTYPE CONSOLE} noch ein eigenes DEFINE baut:
Delphi-Quellcode:
{...}
{$DEFINE DEBUGSERVICE}
{...}
procedure WriteConsole(Text: String);
begin
 {$IFDEF DEBUGSERVICE}
 Writeln(Text);
 {$ENDIF}
end;
Wichtig: Dieses Define gilt nur für diese Unit!

Klappt bisher sehr gut - Feedback erwünscht :wink:

Dezipaitor 23. Nov 2009 15:07

Re: TService debuggen
 
Ganz einfach:
http://blog.delphi-jedi.net/2008/05/...s-an-easy-way/


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 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-2025 by Thomas Breitkreuz