Newsgroup: it.comp.lang.delphi
Titolo: Risalire a linea codice che genera errore

Ciao a tutti, la ditta presso cui lavoro, un paio di anni fa ha
commissionato un software scritto in Delphi 5 ad una software house del
Lazio.
Siamo legalmente possessori dei sorgenti, ma fino ad ora non abbiamo mai
dovuto metterci le mani.
Da qualche tempo gli utilizzatori finali presso i quali installiamo le ns
macchine con questo programma, si lamentano di frequenti errori di 'Access
violation', 'Exception ....'.
Abbiamo cercato la ditta che ha scritto il programma, ma si è detta
'convertita' a vendita hardware e software commerciale, pertanto
impossibilitata a risolvere problemi in quanto priva del personale tecnico.
Ho provato a guardare i sorgenti , ma essendo di dimensioni enormi non
riesco a identificare cosa genera il problema.
Esiste un qualche metodo o componente da inserire nel progetto ricompilato
che mi consenta di risalire alla procedura o funzione che ha scatenato
l'errore ?
Grazie a tutti.
Ciao, Roberto

 ha scritto nel messaggio
news:abr0i2$qoq$1...@fe1.cs.interbusiness.it...


 Ciao, Roberto
Prego,
Andrea


Dal cliente chiaramente non sono in debug !!!
Io ho l'eseguibile che gira (magari da giorni o mesi) e ad un certo punto mi
esce 'Access violation...'
Come faccio a sapere cosa ha generato l'errore ?
Ciao, Roberto

1) Fatti una lista di form, data module e untis che sono quelli che hanno
maggiori possibilità di creare l'errore,
2) su questi moduli aggiungi una direttiva di compilazione $define
3) nei punti nevralgici del codice metti delle righe del tipo:
{$DEFINE DEBUGLOG}
{$ifdef}
WriteOnLog('Adesso apro la query..');
{$ENDIF}
Nella create del form o del data module:
{$ifdef}
AssignFile(Flog, 'c:\logmiaunit.txt');
rewrite(Flog)
{$ENDIF}
nella destroy:
{$ifdef}
CloseFile(FLog)
{$ENDIF}
La funzione writeOnLog:
function TMioForm.WriteOnLog(const Riga: string);
begin
  WriteLn(Flog, Riga
end;
Se hai dei blocchi try..except, includi anche i messaggi delle eccezioni nel
log:
try
  FaiQualcosa
  execpt
  on e:Exception do
  begin
    gestisciEccezione;
  {$ifdef DEBUGLOG }
   WriteOnLog(e.MESSAGE);
   {$ENDIF}
La dichiarazione di questa function e dell'handle del file le metti nella
sezione private:
{$ifdef}
flog: TextFile;
function WriteOnLog(const Riga: string) : integer;
{$ENDIF}
Okkio!
Questo blocco deve precedere la prima dichiarazione di
proce3dure/metodi/funzioni nella sezione provate!
Altrimenti si inkazza.
Ricompili la applicazione e mandi il file exe al tuo cliente.
In questo modo, la tua app creerà una serie di log.
Dopo, dai indicazione all'utente che quando la app si blocca deve:
1) uscire
2) andare nella cartella dove stanno i log
3) zipparli e inviarli via mail a te
4) Rientrare nella applicazione.
Se vuoi, puoi crearti dinamicamente i nomi x i file di log, basandoti su
data e ora di apertura della applicazione.
In questo modo puoi averne di +.
Ma se dentro ci scrivi troppa robbba, rischiano di diventare +ttosto grandi.
Quando avrai risolto l'errore, disattivi la direttiva, ricompili e gli
rimandi il nuovo exe.
Se vuoi altri dettagli, no problem!
Bye
AS

Grazie per le info, avevo giŕ valutato questa strada, ma le operazioni di
cui tenere traccia sono veramente tante,ed altrettando lungo č il tempo di
monitoraggio (giorni o mesi con il programma che gira 24h/24h).
Sto ora provando il componente ExceptHandler ( demo scaricata da
http://genura.softdepia.com/
 ), mi sembra che faccia proprio quello che
voglio io: includo il componente, setto le funzioni e i messaggi di cui
voglio abilitare la supervisione e ricompilo il tutto.
Ho provato a generare volontariamente eccezioni ed errori vari, modificando
il codice in modo da creare situazioni anomale. Mi sono andato a leggere il
log creato e ho potuto risalire direttamente alla linea che ha generato
l'errore.
L'unica 'controindicazione' č che occorre compilare e allegare il detailed
map file.
Ciao, Roberto

 Ciao, Roberto
Ciao,
Andrea


Non proprio, a volte il messaggio di errore è
Access violation at address 00000000. Read of address 00000000.
altre è
Access violation at address 00000001. Read of address 00000001.
altre ancora è
External exception C0000008.
Un find error con questi indirizzi, ritorna con una risposta di linea non
torvata. Perciò l'address restituito è inutilizzabile.
Sono in ambiente Windows2K, l'applicazione non utilizza database, SQL o BDE.
Ciao, Roberto.

 Ciao, Roberto.
Andrea

 ha scritto nel messaggio
news:LdsE8.58957$zW3.8...@news1.tin.it...

L'applicazione, è un controllo di processo industriale, multithread con
scambio di dati TCP/IP.
Si appoggia a DLL commerciali fornite dai produttori di hardware (National
per le interfaccie CAN bus, ecc. ) per la comunicazione con la macchina
operatrice.
Le stesse librerie però le utilizzo anche io nelle mie applicazioni e non mi
hanno mai dato problemi.
Ho verificato come avvengono le chiamate alle funzioni/procedure delle
librerie e mi sembra tutto ok.
Non mi sembra che ci sia consumo progressivo della memoria, perciò tutti gli
oggetti vengono rilasciati correttamente.
Come dicevo in un mio post precedente, ora sto testando il componente
ExceptHandler nella versione demo, se vedo che è una strada percorribile, lo
compro e visto che ci sono i sorgenti inclusi, lo analizzo e lo adatto alle
mie esigenze.
Spero che questo mi porti alla rapida soluzione del problema.
Ciao, Roberto.

l'errore ?
www.eurekalog.com
Ciao!
Peppe
_____
ICQ #9759626
Togli levaccà per contattarmi via email.