Newsgroup: it.comp.lang.delphi
Titolo: Trovare fonte di handles non chiusi

Ciao a tutti, programmo in delphi da molti anni e ho un problema con una applicazione dopo diverse modifiche apportate al codice da differenti team.
Dopo diversi giorni di funzionamento gli handles (visti dal task manager) possono anche essere diverse migliaia e divisi piu o meno in parti uguali sono di tipo event e /Device/Afd.
I secondi da quel che mi è parso di capire sono relativi a socket, ma con un netstat non ho cosi tante connessioni attive, nemmeno contando i TIME_WAIT delle connessioni appena chiuse e nemmeno prendendo in considerazione tutte le connessioni degli altri processi.
Con EurekaLog ho tentato di intercettare questi leaks, ma purtroppo non mi da alcun risultato e chiudendo l'applicazione non viene generato alcun report.
Cercando con google ho letto che con AQTime dovrebbe essere possibile capire in quale parte del codice vengono aperti questi handles che poi non vengono correttamente chiusi, ma la perdita degli handles ce l'ho solamente sul server in produzione e non sul pc di sviluppo, anche perchè sarebbe molto difficile simulare le tante connessioni dei clienti.
Da quel che ho intuito, non avendo mai utilizzato AQtime o un qualsiasi altro tool di profiling, AQtime lo si puo' eseguire solamente dall'ambiente di sviluppo e per me sarebbe molto complicato.
Qualcuno sa se ci sono altri tools che permettono di trovare questi leaks senza la necessità dell'ambiente di sviluppo?
Nel caso possa essere utile utilizzo Delphi XE8 e l'applicazione in se è fondamentalmente un server al quale possono connettersi i clienti per inviare pacchetti con richieste e ricevere le relative risposte.
Grazie.

E' sempre una rogna beccare cose di questo tipo...
Una domanda preliminare: quando parli di handle intendi ogegtti gdi o che altro?
 
 
A.


No non sono oggetti gdi, per farti capire aprendo un buon vecchio task manager scegliendo le colonne da visualizzare e includendo handles, gdi objects e user objects poco fa su una di queste applicazioni avevo rispettivamente 19348, 123, 231 ... 
L'applicazione fondamentalmente è un server al quale si connettono molti utenti con differenti clients (anche non fatti da noi) che implementa diversi protocolli standard (post/get, SMPP, UCP e altri protocolli tcpip).
E' ovviamente multi-thread e il mio sospetto è che in alcuni casi non vengano gestiti correttamente i postmessage() utilizzati per la sincronizzazione delle informazioni (handles di tipo event?) e che in alcuni casi i socket che vengono chiusi, chiudono la connessione in quanto non la vedo con il netstat (handles di tipo \device\afd, ma non va a chiudere correttamente il corrispondente handle.
Queste due tipologie di handles le ho identificate con il Process Explorer di Microsoft, circa la metà a occhio sono di tipo Event e gli altri di tipo \Device\Afd, però da li a riuscire a tracciare dove vengono richieste queste risorse, che non vengono poi rilasciate è un altro paio di maniche.
Se non ci sono tools particolari temo che dovrò perdere giorni di lavoro in simulazioni di ogni tipo. :'(

 Una domanda preliminare: quando parli di handle intendi ogegtti gdi o che altro?
 
"Handle", in Windows, e` qualcosa che si applica a praticamente qualunque tipo di "oggetto" creato dal sistema operativo.
 

 Se non ci sono tools particolari temo che dovrò perdere giorni di lavoro in simulazioni di ogni tipo.
 
Un robusto sistema di logging è tutto quello che serve..
 
-- 
Morde

 Un robusto sistema di logging è tutto quello che serve..
 
Il punto e` che devi sapere DOVE loggare. E sei d'accapo a 12.