Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Mimmo - Gennaio 10, 2022, 04:53:41 pm

Titolo: [Risolto] Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: Mimmo - Gennaio 10, 2022, 04:53:41 pm
Ciao,
stavo facendo un po' di test con la nuova versione di Lazarus 2.2 appena rilasciata e mi sono accorto che la procedura di estrazione dello stack trace in caso di eccezione è diventata lentissima rispetto a fpc 3.0.4. Si conclude con successo ma i tempi si sono decuplicati.
Io uso un po' di codice per scrivere il tracelog ed ottenere un report che scimmiotta un po' EurekaLog ma alla fine sono solo un po' di fiocchetti intorno al codice che è descritto qui https://wiki.freepascal.org/Logging_exceptions (https://wiki.freepascal.org/Logging_exceptions).
Qualcuno ha avuto il medesimo problema?
Grazie,
Mimmo
Titolo: Re:Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: nomorelogic - Gennaio 10, 2022, 05:19:27 pm
come debugger usi gdb o quello nuovo FpDebugger?

se è una installazione ex-novo può darsi sia FpDebugger ed in questo caso potresti rimettere gdb per vedere se i tempi tornano quelli di prima
Titolo: Re:Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: Mimmo - Gennaio 10, 2022, 06:14:50 pm
Ho provato con entrambi ma non cambia nulla.
Stesso risultato utilizzando i diversi livelli di ottimizzazione.
Anche passando da dwarf2 a "dwarf2 con i set" e a dwarf3 la situazione non è migliorata (ho solo notato che con fpDebugger e dwarf3 i nomi delle chiamate nel tracelog rispettano il case originale invece di essere tutte in maiuscolo).
Non ho cronometrato il tutto ma è evidente che con qualsiasi combinazione è molto più lento rispetto a fpc 3.0.4. Non so sotto Linux, per ora ho provato solo su windows.
Nel dettaglio, è l'esecuzione di BackTraceStrFunc che è diventata molto più lenta:

Codice: [Seleziona]
      Result := BackTraceStrFunc(ExceptAddr);
      Frames := ExceptFrames;
      for i := 0 to ExceptFrameCount - 1 do
        Result := Result + sLineBreak + BackTraceStrFunc(Frames[i]);

E altra cosa strana: se rieseguo il codice con l'errore che scatena il tracelog, la procedura diventa un fulmine. E' come se alla prima esecuzione venisse creata qualche struttura dati di appoggio con grande dispendio di risorse che poi viene però conservata in qualche cache per poter essere riutilizzata.
Son solo speculazioni le mie ovviamente... ancora brancolo.
Titolo: Re:Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: Mimmo - Gennaio 10, 2022, 06:18:04 pm
Aggiungo un'altra cosa: sto provando il tutto con un eseguibile un po' ciccione, son 310 mega di file exe. Domani proverò con qualcosa di più snello per vedere se la lentezza è legata alla dimensione del programma.
Titolo: Re:Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: Mimmo - Gennaio 12, 2022, 09:36:04 am
Aggiungo 2 righe giusto per tenerne traccia anche qui.
Ho postato il problema anche sul forum internazionale https://forum.lazarus.freepascal.org/index.php/topic,57840.msg430413.html#msg430413 (https://forum.lazarus.freepascal.org/index.php/topic,57840.msg430413.html#msg430413).
Alla fine è il backtrace che è diventato lento e così rimarrà, il meccanismo comunque continua a  funzionare.
Lo stesso eseguibile ciccione che ho usato sotto windows, l'ho ricompilato su linux e li' problemi di lentezza non ne ho rilevati. Quindi è qualcosa di specifico di win64.
Me lo terrò cosi', aggiungendo un bel cursore a clessidra nelle applicazioni gui a cavallo della procedura di logging (normalmente presento un report all'utente che poi può essere inviato via mail con un click). D'altronde è in questa release che è stato aggiunto Screen.StartWaitCursor...
Titolo: Re:[Risolto] Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: DragoRosso - Gennaio 12, 2022, 11:14:45 am
Scusa se replico a d un post [RISOLTO] ma sono curioso: cosa ti porta ad attivare nella versione compilata di release il "backtrace" ?

Normalmente tali funzionalità vengono sfruttate solo in fase di sviluppo, test di qualità o altro ma non con il prodotto "release".

In genere le applicazioni, appunto dopo una fase di test (chiamiamolo debug o altro), sviluppano un loro log, ma puntuale con il dato / dati essenziali per una analisi (molto spesso ricavati da un try ... except) legati ad anomalie non gestite (o gestite ma che devono essere segnalate).

Stò pensando alle mie applicazioni e se dovessi attivare un backtrace, sarebbe improbabile che possa essere attuato ... ho una stack normalmente occupato con un "sacco" di dati (record ad esempio), e un "sacco" di Thread.

Ciao 
Titolo: Re:[Risolto] Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: Mimmo - Gennaio 13, 2022, 03:31:04 pm
Scusa se replico a d un post [RISOLTO] ma sono curioso: cosa ti porta ad attivare nella versione compilata di release il "backtrace" ?
[...]

Ciao,
nei rilasci ormai d'ufficio mantengo sempre in piedi un meccanismo  "alla eurekalog" perchè mi permette di gestire la manutenzione dei programmi con una efficacia altrimenti impensabile. Non è un log esteso ma solo un modo differente di gestire le eccezioni.
Alla fine la cosa si paga in termini di un eseguibile di taglia extra-large (opzione -gl abilitata in release) ma al giorno d'oggi non è più un problema (almeno nei contesti in cui opero io...) e in ogni caso i benefici ripagano ampiamente.
Nella pratica, quando viene sollevata una eccezione, all'utente compare una finestra come quella visibile nel primo allegato. Da quella l'utente può spedire una mail con un report simile a quello che vedi nel secondo allegato.
Per anni in azienda abbiamo usato Eurekalog con Delphi con grandi benefici. Di notevole c'è che in Lazarus + fpc si riesca a mettere in piedi lo stesso meccanismo ma a costo zero..


Titolo: Re:[Risolto] Estrazione exception backlog lentissima con fpc 3.2.2
Inserito da: DragoRosso - Gennaio 13, 2022, 04:42:23 pm
Grazie per la cortesia della risposta :)

Alla prossima, ciao.