Newsgroup: it.comp.lang.delphi
Titolo: Errori incomprensibli

Ciao a tutti, 
vi è mai capitato che nelle vostre applicazioni
si alzasse un'eccezione che non riuscite a spiegarvi?
Per esempio io ho una funzione a cui passo una serie di parametri,
tale funzione la richiamo più volte in successione da un'altra funzione...
logicamente passandogli paramentri differenti.
Alle volte mi si alza un'eccezione al terzo richiamo della funzione su
citata, alle volte mi si alza un'eccezione alla quinta volta che la
richiamo e alle volte addirittura anche dopo che ho fatto tutto...
sull'END della funzione principale...
Assurdo!
Se diminuisco il numero di volte che richiamo la funzione non mi va mai
in errore..... Se per esempio tolgo un paio di richiami...(a caso),
sembra che funzioni!
Voglio precisare che io alla funzione passo una serie di Array, ma
l'eccezione non indica un overflow... bensì errori incomprensibili alle
volte su vcl.bpl ed altre bpl varie.
Qualcuno ha avuto problemi simili?
Grazie,
Rino

 Qualcuno ha avuto problemi simili?
Sei stato troppo generico: direi che, fondamentalmente, dovresti postare il
codice della funzione.
Gli errori che hai evidenziato, e che sembrano essere dominati dal *caso*,
molto probabilmente potrebbero dipendere dallo stato della memoria.
Ed esempio, lavorando in c++ un giorno mi capito' che il mio programma
scoppiava in maniera totalmente imprevedibile.... dopo ua settimana full
time passata a cercare il problema, migliaia di righe di codice spulciate,
alla fine di tutto era una sprintf legata ad un puntatore non protetto.
In altre parole andavo a scrivere sul disco fisso il contenuto di una zona
di memoria puntata da un puntatore che, se si verificavano certe
particolarissime (non previste) condizioni, era casuale. 
-- 
Morde. 
FAQ di icld (beta-version): 
http://icld.altervista.org
 
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 molto probabilmente potrebbero dipendere dallo stato della memoria.
come faccio a verificarlo?

 come faccio a verificarlo?
log, tanti log, se necessario uno per riga!
Io lo trovai cosi'. quando si lavora con la memoria e' dura prendere subito
le dritte giuste!
L'unice e' loggare l'impossibile!!!!
Facci sapere!
Ciao!


che intendi per log?
devo usare uno di quei programmi che fanno i log di quello che succede in 
memoria?



Si hai capito giusto: io uso da anni con piena soddisfazione Overseer, una
libreria e un programmino esterno per registrare gli eventi di log.
http://delphree.clexpert.com/pages/projects/nexus/files/overseer.zip
Ecco di seguite i passi per utilizzarlo:
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... 
Ci sono anche le utility messe a disposizione dalla jcl, ma non
conoscendole ho preferito suggerirti overseer.


 Ciao!
Ciao,
scusate se mi intrometto, leggevo e overseer mi ha incuriosito ma prima di
scaricarlo e installarlo volevo farti alcune domande visto che lo usi con
soddisfazione:
lo si usa esculivamente come debugger o lo posso lasciare sempre attivo
nelle mie applicaizoni e loggare le operazioni che fa l'utente?influisce
molto come prestazioni se lasciato sempre attivo?l'utente finale vede
niente?
ti faccio queste domande perchč sarebbe mia intenzione loggare, oltre agli
errori, anche gli orrori che fa l'utente. Ad esempio, "mi č sparito questo
articolo, il programma non va!" poi magari dal log si vede che l'articolo
l'ha cancellato lui a manina...posso usarlo per questo scopo o mi consigli
qualcosa di differente?
ti e vi ringrazio anticipatamente
-- 
Emanuele.

 ti e vi ringrazio anticipatamente
Dipende da te.
Io per loggare le attivita' dell'utente uso una tabella del database.
Con la mia applicazione distribuisco anche il debugger: mi capita a volte
di dover fare teleassistenza e cosi' facendo ho un log in real time pronto
per essere salvato su disco, preso e analizzato poi da me con calma.
L'uso che ne faccio io e' proprio quello di logger dei dati, delle
procedure, non tanto dell'operativita' del cliente.
Spesso loggo i risultati delle query e le query stesse, cosi' con un copia
incolla posso riprodurle nel database direttamente.
In overseer ho modificato i sorgenti, in modo da evitare che si apra ogni
qualvolta lancio l'applicativo che ne istanzia una istanza in memoria.
Poi ho anche aggiunto qualche utility per visualizzare meglio certi log
corposi in un memo piuttosto che in finestra.


 Ciao!
ti ringrazio sei stato molto chiaro e cortese
ciao ciao
-- 
Emanuele.