FastMM é confiável ?
Olá amigos,
Há alguns dias descobri essa possibilidade: de encontrar vazamentos de memória através do FastMM com Delphi7.
Tive dificuldades em encontrar os tais vazamentos em aplicações em produção ...
Então comecei uma do zero para ver como seria ...
No form principal fui incluindo as funcionalidades, como controle centralizado de erros com envio de e-mail, controle de ociosidade, etc
Testando, um por um, saindo da aplicação a cada teste para ver se algum problema era apontado ...
Até que ao implementar o envio dos erros por e-mail, o erro ocorreu:
´Essa aplicação teve vazamentos de memória ...
21-28 bytes: TCriticalSection x 1 ´
(o mesmo erro que não consegui encontrar na aplicação pronta)
Achei que já havia achado o tal problema, visto que a última função que implementei fora ´ envio dos erros por e-mail´ ...
Comentei a função e para a minha surpresa o erro persistiu !
Reiniciei o Delphi ... despois a máquina ... e agora sempre ao sair do sistema o erro aparece !!
Será que esse erro existe mesmo !?
Obrigado.
Francisco.
Há alguns dias descobri essa possibilidade: de encontrar vazamentos de memória através do FastMM com Delphi7.
Tive dificuldades em encontrar os tais vazamentos em aplicações em produção ...
Então comecei uma do zero para ver como seria ...
No form principal fui incluindo as funcionalidades, como controle centralizado de erros com envio de e-mail, controle de ociosidade, etc
Testando, um por um, saindo da aplicação a cada teste para ver se algum problema era apontado ...
Até que ao implementar o envio dos erros por e-mail, o erro ocorreu:
´Essa aplicação teve vazamentos de memória ...
21-28 bytes: TCriticalSection x 1 ´
(o mesmo erro que não consegui encontrar na aplicação pronta)
Achei que já havia achado o tal problema, visto que a última função que implementei fora ´ envio dos erros por e-mail´ ...
Comentei a função e para a minha surpresa o erro persistiu !
Reiniciei o Delphi ... despois a máquina ... e agora sempre ao sair do sistema o erro aparece !!
Será que esse erro existe mesmo !?
Obrigado.
Francisco.
Francisco.riva1
Curtidas 0
Respostas
Sremulador
12/02/2008
Amigo eu tb utilizo o FMM, mas ainda não descobri este ultimo erro que aparece...
GOSTEI 0
Francisco.riva1
12/02/2008
Bom dia sremulador,
Você conseguiu simular o erro aí ?
Se não conseguiu ... tem uma video aula do Luciano Pimenta, com o título ´Enviando email com os componentes indy´ ... tem o projeto junto com a video aula ...
É só baixá-la, acrescentar no search das options project o caminho do fasMM e colocar as units FastMM4 e FastMM4Messages, no Source, antes de Forms ..
Só de executar e sair do projeto o erro já aparece !!
21-28 bytes: TCriticalSection x 1
PS. O problema parece estar com os componentes idMessage e idSMTP da indy :(
Abraços,
Francisco.
Você conseguiu simular o erro aí ?
Se não conseguiu ... tem uma video aula do Luciano Pimenta, com o título ´Enviando email com os componentes indy´ ... tem o projeto junto com a video aula ...
É só baixá-la, acrescentar no search das options project o caminho do fasMM e colocar as units FastMM4 e FastMM4Messages, no Source, antes de Forms ..
Só de executar e sair do projeto o erro já aparece !!
21-28 bytes: TCriticalSection x 1
PS. O problema parece estar com os componentes idMessage e idSMTP da indy :(
Abraços,
Francisco.
GOSTEI 0
Massuda
12/02/2008
Se estiver usando o Indy que veio com o Delphi, atualize ele. Isso é crítico se você estiver usando D2006 ou D2007.
GOSTEI 0
Francisco.riva1
12/02/2008
Boa tarde Massuda,
Sim, utilizo o Indy que veio com o Delphi, mas uso o Delphi 7.
Também preciso atualizar o indy ?
Obrigado pela atenção.
Abraços,
Francisco.
Sim, utilizo o Indy que veio com o Delphi, mas uso o Delphi 7.
Também preciso atualizar o indy ?
Obrigado pela atenção.
Abraços,
Francisco.
GOSTEI 0
Massuda
12/02/2008
Também preciso atualizar o indy ?
Seria bom. O Indy que veio com seu Delphi é o Indy 9. Baixe o Indy 9.0.18 :arrow: [url=http://www.indyproject.org/Sockets/Download/Files/Indy9.en.aspx]desta página[/url]; essa é a última versão oficial; existe outra ´não-oficial´, mais recente, que você pode obter via CVS ou de um do :arrow: [url=http://indy.fulgan.com/ZIP/]site de snapshot[/url] do Indy. Instruções para instalação, você encontra no meio :arrow: [url=http://forum.devmedia.com.br/viewtopic.php?t=57069]deste tópico[/url]. Não recomendo usar Indy 10.
GOSTEI 0
Francisco.riva1
12/02/2008
Olá Massuda,
Atualizei o Indy como indicou ( Indy 9.0.18 ) ... mas esta versão parece ter vazamentos de memória também ... pelo menos é o que indica o FastMM ... :(
´Essa aplicação teve vazamentos de memória ...
21-28 bytes: TCriticalSection x 1 ´
Abraços,
Francisco.
Atualizei o Indy como indicou ( Indy 9.0.18 ) ... mas esta versão parece ter vazamentos de memória também ... pelo menos é o que indica o FastMM ... :(
´Essa aplicação teve vazamentos de memória ...
21-28 bytes: TCriticalSection x 1 ´
Abraços,
Francisco.
GOSTEI 0
Massuda
12/02/2008
A mensagem de erro do FastMM deve(ria) incluir indicações de onde onde foi feita a alocação da memória que vazou. talvez este tópico...
http://forum.clubedelphi.net/viewtopic.php?t=81471
...seja útil para você.
http://forum.clubedelphi.net/viewtopic.php?t=81471
...seja útil para você.
GOSTEI 0
Francisco.riva1
12/02/2008
Olá Massuda,
Eu já havia lido este tópico também ... mas mesmo assim ficou difícil para eu resolver ... o vazamento de memória parece estar nos componentes da indy idSMTP e/ou idMessage :(
Coloco os dois componentes no Form o problema aparece, retiro ... o vazamento de memória é resolvido :(
Veja os detalhes :
Um bloco de memória vazou. O tamanho é: 28
Caminho da pilha quando esse bloco foi alocado (endereços de retorno):
402A87 [system.pas][System][@GetMem][2447]
40375F [system.pas][System][TObject.NewInstance][8368]
403B26 [system.pas][System][@ClassCreate][9027]
440956 [SyncObjs.pas][SyncObjs][TCriticalSection.Create][194]
4043D3 [system.pas][System][@InitResStringImports][11129]
4B910B [IdComponent.pas][IdComponent][IdComponent][185]
40432C [system.pas][System][InitUnits][10853]
404393 [system.pas][System][@StartExe][10918]
406C5F [SysInit.pas][SysInit][@InitExe][668]
5419F4 [D:\Delphi7Pesquisa\Prj\Fontes\Prj.dpr][Prj][Prj][15]
O bloco está sendo usado por um objeto da classe: TCriticalSection
O número da alocação é: 287
Dump de memória atual de 256 bytes iniciando no endereço DABD28:
10 09 44 00 20 62 14 00 ...
--------------------------------2008/2/14 20:48:56------------------------------
Essa aplicação teve vazamentos de memória. Os vazamentos dos blocos pequenos são (excluindo os vazamentos esperados registrados por ponteiro):
21 - 28 bytes: TCriticalSection x 1
...
Se descobrir alguma coisa que possa resolver este problema, por favor, conta aí pra gente que usa o Indy :)
Obrigado pela atenção !
Abraços,
Francisco.
Eu já havia lido este tópico também ... mas mesmo assim ficou difícil para eu resolver ... o vazamento de memória parece estar nos componentes da indy idSMTP e/ou idMessage :(
Coloco os dois componentes no Form o problema aparece, retiro ... o vazamento de memória é resolvido :(
Veja os detalhes :
Um bloco de memória vazou. O tamanho é: 28
Caminho da pilha quando esse bloco foi alocado (endereços de retorno):
402A87 [system.pas][System][@GetMem][2447]
40375F [system.pas][System][TObject.NewInstance][8368]
403B26 [system.pas][System][@ClassCreate][9027]
440956 [SyncObjs.pas][SyncObjs][TCriticalSection.Create][194]
4043D3 [system.pas][System][@InitResStringImports][11129]
4B910B [IdComponent.pas][IdComponent][IdComponent][185]
40432C [system.pas][System][InitUnits][10853]
404393 [system.pas][System][@StartExe][10918]
406C5F [SysInit.pas][SysInit][@InitExe][668]
5419F4 [D:\Delphi7Pesquisa\Prj\Fontes\Prj.dpr][Prj][Prj][15]
O bloco está sendo usado por um objeto da classe: TCriticalSection
O número da alocação é: 287
Dump de memória atual de 256 bytes iniciando no endereço DABD28:
10 09 44 00 20 62 14 00 ...
--------------------------------2008/2/14 20:48:56------------------------------
Essa aplicação teve vazamentos de memória. Os vazamentos dos blocos pequenos são (excluindo os vazamentos esperados registrados por ponteiro):
21 - 28 bytes: TCriticalSection x 1
...
Se descobrir alguma coisa que possa resolver este problema, por favor, conta aí pra gente que usa o Indy :)
Obrigado pela atenção !
Abraços,
Francisco.
GOSTEI 0
Massuda
12/02/2008
No fonte do IdComponent, tem este comentário sobre o vazamento de memória que foi detectado pelo FastMM...
Portanto: esse vazamento é intencional e não causará dano ao seu programa.
// Dont Free. If shutdown is from another Init section, it can cause GPF when stack
// tries to access it. App will kill it off anyways, so just let it leak
// FreeAndNil(GStackCriticalSection);
...ou seja, o desenvolvedor do Indy intencionalmente deixou esse objeto para trás e o comentário dele é correto: como é um objeto global, não faz mal deixá-lo sem destruir, já que ele será destruído quando o programa terminar.Portanto: esse vazamento é intencional e não causará dano ao seu programa.
GOSTEI 0
Francisco.riva1
12/02/2008
Mais uma vez, obrigado pelo empenho em ajudar-nos.
Abraços,
Francisco.
Abraços,
Francisco.
GOSTEI 0
Vitor Rubio
12/02/2008
Muito interessante esse tópico, talvez seja a resposta da minha duvida:
quando uso interfaces, não destruo meus objetos, porque as interfaces não tem um metodo destroy.
Sempre disseram que não precisa destruir objetos alocados em interfaces pois eles são destruidos quando o contador de referencias chega a zero.
Mas apesar disso, quando uso TinterfacedPersistent ou qualquer outra classe que implemente interfaces diferente de TinterfacedObject o fastmm4 me fala que houveram memory leaks.
O TinterfacedObject já funciona normal.
TAggregatedobject e tcontainedobject sempre causam memory leaks, e delegações tambem.
com relação ao comentario do indy:
GStackCriticalSection é um objeto critical section para proteger acesso simutaneo a regioes de codigo não - thread safe dentro de threads.
você pode destruir ele no finalization da ultima unit do seu projeto ou (eu acho) depois do run no seu arquivo.dpr.
mas como o massuda disse, não precisa destruir, pois uma hora ou outra ele será destruido.
quando uso interfaces, não destruo meus objetos, porque as interfaces não tem um metodo destroy.
Sempre disseram que não precisa destruir objetos alocados em interfaces pois eles são destruidos quando o contador de referencias chega a zero.
Mas apesar disso, quando uso TinterfacedPersistent ou qualquer outra classe que implemente interfaces diferente de TinterfacedObject o fastmm4 me fala que houveram memory leaks.
O TinterfacedObject já funciona normal.
TAggregatedobject e tcontainedobject sempre causam memory leaks, e delegações tambem.
com relação ao comentario do indy:
GStackCriticalSection é um objeto critical section para proteger acesso simutaneo a regioes de codigo não - thread safe dentro de threads.
você pode destruir ele no finalization da ultima unit do seu projeto ou (eu acho) depois do run no seu arquivo.dpr.
mas como o massuda disse, não precisa destruir, pois uma hora ou outra ele será destruido.
GOSTEI 0