Newsgroup: it.comp.lang.delphi
Titolo: Conoscere linea Delphi che genera l'errore

Ben ritrovati a tutti.
Ho un programmino che mi da qualche problemino, visto che è ancora in fase
di costruzione, così ho pensato che gestendo gli errori (e non solo) con un
file log ho la possibilità di leggermelo anche in poltrona.
La domanda è, come da oggetto:
Esiste un modo per conoscere la linea della unit che mi ha sollevato
l'eccezione?
Non essendo interessato a componenti già fatti, che molto spesso hanno molto
più di quello che m'interessa, vorrei farlo io a manina.
Many thanks.
Cià
Fra. :-)

 l'eccezione?
Assolutamente si!
Per fare questo tipo di lavoro, se vuoi farlo a manina e da zero,
sicuramente ti passerà subito la voglia appena dopo aver saputo tutto quello
che ci sta dietro ad una cosa del genere .... :)
Quello che ti serve è uno "stack trace".
Lo stack trace l'ho utilizzato in fase di beta test di un software
abbastanza complesso e devo dire che mi ha soddisfatto da morire.
Addirittura avevamo implementato anche una sorta di spedizione automatica
del file di log ad un nostro server che poi consultavamo per capire "chi ha
scatenato cosa"......
Nulla togliendo alle performance del software stesso riesco a risalire a
tutti i metodi delle classi coinvolte fino ad arrivare alla riga di codice
che ha sollevato l'eccezione.
Per far ciò ho utilizzato un semi-tool che compila il software portando
dentro l'exe tutte le informazioni necessarie per lo stack trace. Una volta
sollevata l'eccezione tutto quello che è stato coinvolto in ciò viene
loggato su un banale file di testo riportando Classi, metodi, num. di riga
etc.. etc.. insomma quello di cui hai bisogno per debuggare...
Il prezzo da pagare è l'aumento di un pò di kb dell'exe (ma poi... in fase
di beta test..... ma chi se ne frega!).
Io ho usato HVEST è mi sono trovato molto bene e se non erro l'ho scaricato
dal sito di Code Central:
http://codecentral.borland.com/codecentral/ccweb.exe/home
bye
Acqua

 
http://codecentral.borland.com/codecentral/ccweb.exe/home
Confermo, ho appena controllato e sta lě.
L'ID č 15973
bye bye,
Acqua

 l'eccezione?
Si' (vedi le JCL (unit JclDebug))
Saluti
Paolo Arosio

Ringrazio per le risposte.
Ho risolto per mezzo di alcune funzioni del JCL. Simpatica la JVCL, anche se
c'è una marea di roba che certamente non userò mai.
Ho scaricato e provato il codice del CodeCentral, ma non sono approdato a
nulla così per il momento vado col Jedi, in seguito riprenderò il codice
"Borland" e lo rimetterò sotto.
Che la forza sia con voi! ;-)
Cià
Fra. :-)

 "Borland" e lo rimetterň sotto.
Non riesco a trovare il componente, qualcuno mi aiuta???
Ciao

 "Borland" e lo rimetterò sotto.
Ho beccato la unit ma (jcldebug), ma qual'è la procedura che mi ritorna la
linea d'errore??
Ciao e grazie.

 linea d'errore??
Negli examples del JCL e delle JVCL trovi tutto ciò di cui hai bisogno.
Cià
Fra. :-)

 ha scritto nel messaggio
news:SPcOa.40394$HU3.1...@news2.tin.it...

Non è che sia tanto semplice....
potresti postarmi come fare?
Ciao

 ritorna la linea d'errore??
__LINE__
Saluti
Paolo Arosio


Questa funzione mi torna sempre 0
Come è possibile??
Dove sbaglio?

Come al solito quando ci si mette davanti ad un computer si fanno sempre ore
insulse!
Ma veniamo a noi, io ho agito in questo modo, prendendo spunto dagli
examples delle librerie che ho nominato:
Poichč m'interessava avere un log pressochč totale degli errori sollevati
all'interno del programma, ho agito all'interno del file [Program
NomeMioProgramma] inserendo nelle uses queste due units: JclDebug,
JclHookExcept, JclSysInfo.
La procedura [ procedure LogException(bla bla bla) ]  l'ho dichiarata prima
del Begin...End principale e vi ho inserito il codice necessario per la
scrittura nel file di Log, cosa abbastanza semplice.
Le prime righe scritte subito dopo il Begin principale sono:
  // queste 3 righe sono necessarie perchč attivano
  // il meccanismo ed il livello d'intercettazione degli errori.
  // Prima dell'End conclusivo č necessario "spegnere il notificatore"
  // di errori... vedi in fondo al codice.
  JclStackTrackingOptions := JclStackTrackingOptions;// Guarda la unit delle
definizioni
  JclStartExceptionTracking;
  JclAddExceptNotifier(LogException);
  // ********************************
Al termine del codice e prima dell'End principale, dipende da ciņ che hai
nel tuo codice, ho inserito:
         // Interrompe l'intercettazione errori.
         JclRemoveExceptNotifier(LogException);
Cią & cią e.... buona notte al secchio.
Fra.  :-)

Dove sbaglio?
Forse la spiegazione e' nella documentazione, credo che sia qualche opzione da
attivare nella compilazione. (tipo map file o simile)
Io uso un altro sistema di debugging, ma alla fine mi rendo conto che sono
tutti simili: fai partire un ascoltatore, e poi durante il programma gli passi
messaggi che lui cattura e appunto memorizza.
Per chi fosse interessato io uso overseer debugger
http://delphree.clexpert.com/pages/projects/nexus/overseer_debugger.htm
Se interessa posso postare il codice per gestirlo, e' piu' semplice a farlo
che a dirlo (il debugging).
-- 
Morde. 
(morde at programmer dot net)


se non sbaglio la soluzione è (credo di averla letta proprio nel ng qualche
tempo fa):
  Project --> Options --> Linker--> Map File -->Detailed
ciao

 ha scritto nel messaggio
news:vs2qgv8s3su8mpjam...@4ax.com...

Posta posta...
Ciao e grazie


Innanzitutto ti pregherei di quotare meglio, dover rileggere un messaggio
intero quotato dopo averlo letto precedentemente, non e' il massimo in fatto
di chiarezza e leggibilita' del thread...
Giusto ? ;-)
Veniamo al sorgente.
1) Dopo aver aggiunto alla path del progetto il percorso dei sorgenti
(tipicamente ...\overseer\Source), aggiungi alla unit principale del tuo
progetto la uses udbg.
2) sempre nella unit principale dichiara come public l'oggetto debugger
public
   DbgMainFrm : TNxDebugger;
3) A questo punto devi inizializzare l'ascoltatore: attento questa operazione
devi farla all'inizio del programma.
Nell' OnCreate della form principale, aggiungi:
   DbgMainFrm := TNxDebugger.Create ('frmMainHello','Hello world'); // creato
   NxStartDebug; // inizializzato
4) Da adesso in avanti potrai loggare tutto quello che vuoi. hai a
disposizione funzioni per loggare tutti i tipi di dato, in piu' gli oggetti e
le loro proprieta'. 
Qualche esempio:
DbgMainFrm.LogMsg('Update Ultimo Prezzo');
DbgMainFrm.LogFmtMsg('Il campo ordinamento è %s, %s',[sFOrd,s]);
DbgMainFrm.LogFmtError('Errore DB: [%s]',[E.message]);
5) Alla fine del programma, ricordati di far cessare l'ascolto e liberare le
risorse.
Nell' OnDestroy del form principale, aggiungi:
   NxEndDebug;
   DbgMainFrm.Free;
Questo e' solo un sempio basilare di utilizzo, ci sono funzioni avanzate che
ti permettono di categorizzare (error, warning, note, enterprocedure,leave...)
i messaggi, puoi loggarti interi oggetti con tutto le proprieta' con una sola
riga:
DbgMainFrm.LogObject('Oggetto Column->Field',Column.Field)
DbgMainFrm.LogObject('ADOConnection2',ADOConnection2);
Ovviamente hai un visualizzatore di log, e il log puo' essere fatto su file,
in real time, ecc...
Tutto fornito con i sorgenti (io mi sono fatto delle personalizzazioni).
Ciao e ricordati di quotare meglio ;-)


 Nell' OnCreate della form principale, aggiungi:
Anch'io ho provato ad inserire l'intercettatore nell'OnCreate della
MainForm, ma casualmente mi si è verificato un problema all'avvio del quale
non ne ho avuto traccia, quindi ho preferito spostare il tutto nel file di
programma, proprio come prima operazione. Penso (IMHO) che questo modo di
fare possa tornare utile soprattutto quando prima di chiamare la form
principale, al prg fai fare qualcos'altro (Creazione/Check archivi,
impostazioni di registro, ecc.).
P.S.
Nel mio post notturno ho dimenticato che va impostato il [ Map File ] a <
Detailed >
Cià
Fra.


Ci siamo
In effetti __LINE__  e   LineByLevel  fanno proprio questo
L'unica controindicazione è che se implemento la procedura nell'evento
OnException di un TApplicationEvent  la linea risultante è sempre la stessa
ciò quella dell'OnException dell'ApplicationEvent, nonostante che siano
punti diversi del prog a sollevare eccezione..
Ho provato anche a cambiare level 1,2,3  ma niente!
Ciao e grazie

 Giusto ? ;-)
Hai ragione, sorry
Scarico il comp e provo il tuo code
Ciao

Hai dato un'occhiata all'esempio [ FramesTrackExample ] nella JCL?
Cià
Fra.

> Hai dato un'occhiata all'esempio [ FramesTrackExample ] nella JCL?
OK Grazie
Adesso funziona
ciao