Newsgroup: it.comp.lang.delphi
Titolo: [D7] Debug Servizi

C'è qualcuno che ha esperienza di debug dei servizi in Delphi 7.0 ? 
quello che c'è scritto nel manuale o nell'help non mi funziona o non 
riesco a farlo funzionare ... :-p
per ora ho fatto con i log ... 
volevo sapere se c'era una strada più semplice ... e più "normale" :-), 
con tanto di breakpoint, watch e tutto il resto ... 
 
M.
--- posted by geoForum on 
http://www.delphiedintorni.it

 riesco a farlo funzionare ... :-p
Ancora uno stupendo esempio di post da utente finale postatto su un ng 
di sviluppatori....
Ke kakkio significa "non mi funziona", "non riesco a farlo funzionare".....
-- 
Alberto Salvati
A NEAPOLITAN Delphi Developer who is studying c# and .net
"Dicette 'o pappece 'nfaccia 'a noce dammi 'o tiempo che pure te spertoso"

Ke kakkio significa "non mi funziona", "non riesco a farlo funzionare".....
Stanco? ;-)
Significa quello che ha scritto.
Utilizzando il sistema scritto sull'help di Delphi, il debug dei
servizi non funziona, c'e' ben poco altro da dire.
Il mio consiglio è questo: scrivi tutto il codice del servizio in una
unit separata, scriviti una normalissima applicazione e falle chiamare
il codice che ti serve.
-- 
Ore 18.30: premo invio.

il codice che ti serve.
Che se ho ben capito in gergo si dice di sviluppare un driver.
E corretto oppure ho detto una cagata?
Stefano Lorenzi



No, nello specifico non si tratta di scrivere un driver, ma molto più
semplicemente di creare una semplice interfaccia che richiami il
codice del servizio senza che questo sia un servizio.
Mi spiego meglio :)
Delphi mette a disposizione una classe (TServiceController) che si
occupa, praticamente senza bisogno del nostro intervento diretto, di
gestire le comunicazioni tra il service manager di Win e il nostro
servizio.
L'evento principale, alla pari di Execute di TThread, è ServiceExecute
che, in teoria, dovrebbe solamente occuparsi di "loopare" su
ServiceThread.ProcessRequests (una specie di
Application.ProcessMessages)  e controllare la variabile Terminated.
Tutto il resto dovrebbe essere al di fuori di TService.
Per esempio, questo è quello che normalmente troveresti in un mio
servizio
MainThread := TMainThread.Create(True);
try
  MainThread.FreeOnTerminate := False;
  //qualche altra amenità relativa a MainThread
  MainThread.Resume;
  try
    while not Terminated do
      ServiceThread.ProcessRequests(True);
  finally
    SetEvent(QuitEvent);
    if WaitForSingleObject(MainThread.Handle, 10000) <> WAIT_OBJECT_0
then
   begin
      EventLog.AddLogInfo(tsError, 'Main thread not respondig,
shutting down...');
      TerminateThread(MainThread.Handle, 0);
    end else
      MainThread.Free;
  end;
except
  on e: Exception do
    EventLog.AddLogInfo(tsError, e.Message + '-' + e.ClassName);
end;
Come vedi, a parte creare una thread, a processare le richieste di
serviceman e chiudere la thread, ServiceExecute non fa null'altro.
Normalmente, oltre ad avere il progetto sotto forma di servizio ho
anche una TApplication con un bel pulsante e nell'evento OnClick
simulo l'esecuzione del servizio (e debuggo senza problemi). Tempo
totale per fare tutto, 5 minuti.
Questo risulta molto semplice se:
1) tutto il codice al di fuori del TService si trova in una unit
separata.
2) TService fa solo quello che deve fare (gestire i messaggi).
Ciao.


 2) TService fa solo quello che deve fare (gestire i messaggi).
Esatto, ma potrebbero sorgere problemi nel caso il servizio debba girare con
autorizzazioni specifiche, giusto (per esempio Admin in un utente non
Admin)?
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
La natura non fa nulla di inutile (Aristotele)

Admin)?
In effetti non mi sono mai posto il problema avendo io privilegi di
amministratore.
Nel caso specifico non ho una soluzione pronta ;-)


 Nel caso specifico non ho una soluzione pronta ;-)
Non è solo una questione di privilegi ma anche di altre cose: se sei un
utente divreso da quello che "speri" di essere, diventa non banale anche
trovare la cartella My Documents che interessa all'utente...
-- 
Lis                 
www.alessandroghezzi.it
O'Telma Formula1:   
http://snipurl.com/otelma
Gli aerei sono dei bei giocattoli, ma di nessuna utilità militare (F.Foch)

il codice che ti serve.
Già fatto ... 
Ho utilizzato un DataModule, perché oltre che a scrivere codice che 
sarebbe stato in comune fra applicazione e servizio, dovevo anche 
inserirvi dei componenti.
I problemi a cui trovare soluzione sono due: 
1) diritti di amministrazione, e quant'altro, come accennato nei post 
dopo il tuo ... e sono cose che con l'applicazione non vedi!!
2) il servizio deve rispondere ottimamente all's.c.m. di windows, cosa 
che, non sempre fa. (l'applicazione sviluppata è di una certa 
complessità...)
---------
1) si risolve semplicemente fottendosene ... il servizio gira 
come .\Administrator, con la brutta conseguenza che se il software fa 
danno, lo fa con tutti i diritti possibili!! ... e questo non va tanto 
bene (per la cronaca è già successo che inavvertitamente abbia fatto 
danno :-(( cancellando dei files ... )...
2) sto risolvendo con log a mano e provando parti di codice in piccole 
applicazioni scritte ad hoc ...
Così è forse impossibile capire i problemi ai quali cerco la 
soluzione ... ma io volevo solo sapere, se qualcuno, in barba a quello 
che è scritto nel manuale e nell'help di delphi, ha debuggato i servizi 
come una qualsiasi applicazione normale, con tanto di breakpoints watch 
ecc..ecc...ecc... 
ma sembra che tutto ciò sia impossibile ... :-((
ciauz.


 ecc..ecc...ecc... 
Io, senza alcun tipo di problema e seguendo alla lettera l'help in linea:
- compilo
- registro il servizio (da riga di comando)
- avvio il servizio (dal service manager)
- avvio il debug con l'attach al processo
- ...
- chiudo
- verifico che il processo non sia per qualche motivo ancora attivo (da 
task manager) eventualmente lo termino
- deregistro il servizio
Il test delle funzionalità in un'applicazione stand alone a mio avviso 
vale molto poco perchè l'ambiente di esecuzione ha caratteristiche 
piuttosto diverse.
Ciao,
Gianluca.


Sono d'accordo ... a metà! :-)
vale fino ad un certo punto ... poi è completamente ininfluente :-)
Ciao 
Marco
