Ir para conteúdo
  • Cadastre-se

Anizair Lopes

Membros
  • Total de ítens

    53
  • Registro em

  • Última visita

Posts postados por Anizair Lopes

  1. Olá Daniel Simões,

    Em Testes feito com o DUnit e o FastMM ocorreu o seguinte problema.

    Quando estava setado true nas Lista internas do Objeto TRegistro60M não estava sendo liberado os objetos internos ou seja ficando os ObjectList interno sem ser liberado.

    Ex : tinha 30 Registro60M e ficavam 30 Registro60A, 30 Registro60D, e 30 Registro60I.

    Quando eu fiz o procedimento de correção citado no post o fastMM não mas acusou estes registros como leaks de memoria.

    ou seja, significa que foram todos liberados.

    vou voltar o codigo original fazer um teste com o fastMM e postar os logs aqui.

    Analise os logs, e se achar alguma outra correção favor postar aqui.

    ConthabWinTests_MemoryManager_EventosLog.txt

    ConthabWinTests_MemoryManager_EventosLog.txt

  2. Olá a todos já que niguém me respondeu a questão do memory leak no AcbrSintegra referente ao post anterior quero dizer que já encontrei a solução para o problema e gostaria que fosse corrigido no SVN para quando eu fizer um update do repositório não perdesse a minha codificação.

    Bom a solução e bastante simples e somente iremos alterar a classe TRegistro60M no seu metodo create que está conforme mostrado abaixo:

    
    constructor TRegistro60M.Create;
    
    begin
    
      inherited Create;
    
      FRegs60A:=TRegistros60A.Create(True);
    
      FRegs60D:=TRegistros60D.Create(True);
    
      FRegs60I:=TRegistros60I.Create(True);
    
    end;
    
    
    
    iremos alterar e colocar um false para criar as listas sem ser Owner para que a responsabilidade de destruir a lista fique por nossa conta abaixo segue o codigo corrigido.
    
    constructor TRegistro60M.Create;
    
    begin
    
      inherited Create;
    
      FRegs60A:=TRegistros60A.Create(False);
    
      FRegs60D:=TRegistros60D.Create(False);
    
      FRegs60I:=TRegistros60I.Create(False);
    
    end;
    
    
    agora no método destrutor da classe TRegistro60M iremos destruir as listas referentes aos registros 60A, 60I e 60D conforme codificação abaixo:
    
    destructor TRegistro60M.Destroy;
    
    begin
    
      FreeAndNil(FRegs60A);
    
      FreeAndNil(FRegs60D);
    
      FreeAndNil(FRegs60I);
    
      inherited;
    
    end;
    
    

    Feito isso não existirá mais leaks de memória para esse registos.

    Espero ter ajudado e qualquer dúvida entre em contato.

  3. Olá estou utilizando o ACBrSintegra em um projeto e detectei alguns memory leaks nos registros 60A, 60D, 60I..

    Um bloco de memória vazou. O tamanho é: 116

    Este bloco foi alocado pela thread 0x5C0, e a análise da pilha interna (endereços de retorno) no momento era:

    40AA1E [..\..\biblioteca\rede unifar\FastMM4.pas][FastMM4][DebugReallocMem][6990]
    
    402A8F [System][@ReallocMem]
    
    423CB0 [Classes][TList.SetCapacity]
    
    423AE8 [Classes][TList.Grow]
    
    4238F9 [Classes][TList.Add]
    
    442FB9 [Contnrs][TObjectList.Add]
    
    5AFF20 [ACBrSintegra.pas][ACBrSintegra][TRegistros60D.Add][3030]
    
    5A96D4 [ACBrSintegra.pas][ACBrSintegra][TACBrSintegra.GerarConjuntoRegistros60][1579]
    
    5A938B [ACBrSintegra.pas][ACBrSintegra][TACBrSintegra.GeraArquivo][1507]
    
    5B7ED0 [..\Model\UnitModelGerarArquivos.pas][UnitModelGerarArquivos][TModelGerarArquivos.GerarArquivo][114]
    
    5B8294 [\\des03\Fontes\prjdelphi\ConthabWin\Model\dunit\UnitModelGerarArquivosTests.pas][UnitModelGerarArquivosTests][TModelGerarArquivosTests.TestGerarArquivo][70]
    
    
    O bloco está sendo usado por um objeto da classe: Desconhecida
    
    
    e o final do registro de log encontra-se assim
    Essa aplicação teve vazamentos de memória. Os vazamentos dos blocos pequenos são (excluindo os vazamentos esperados registrados por ponteiro):
    
    
    13 - 20 bytes: TObjectList x 3, TRegistros60D x 30, TRegistros60I x 30, TRegistros60A x 30, AnsiString x 1, Desconhecida x 3
    
    21 - 36 bytes: TWinHelpViewer x 1, AnsiString x 2, Desconhecida x 3
    
    37 - 52 bytes: THelpManager x 1, TStringList x 3, Desconhecida x 34
    
    101 - 116 bytes: Desconhecida x 8
    
    165 - 180 bytes: Desconhecida x 13
    
    213 - 244 bytes: Desconhecida x 1
    
    277 - 308 bytes: Desconhecida x 3
    
    341 - 388 bytes: Desconhecida x 1
    
    
    Nota: O detalhe do vazamento de memória está logado em um arquivo texto na mesma pasta que essa aplicação. Para desabilitar essa checagem de vazamento de memória, desabilite o DEFINE "EnableMemoryLeakReporting".
    
    
    Analisando a linha de erro gerado pelo DUnit o problema está nas linha de codigo abaixo
    
    procedure TACBrSintegra.GerarConjuntoRegistros60;
    
    var
    
      i: Integer;
    
      wregistro60M: TRegistro60M;
    
    begin
    
    //associo todos os registros 60A/D/I criados a um registro 60M existente
    
    //com esta abordagem permite-se que o usuario adicione registros fora
    
    //de ordem na aplicacao cliente, ex: adiciona analitico primeiramente ao master.
    
    //Com isto não há obrigacao de amarrar analitico ao master..deixando por conta do componente
    
    //nao sei dizer se este processo de ordenacao efetuado pode tornar-se lento
    
    
    if FVersaoValidador=vv524 then
    
    begin
    
      //60A
    
      for i:=0 to Registros60A.Count - 1 do
    
      begin
    
        wregistro60M:=GetRegistro60M(Registros60A[i].Emissao,Registros60A[i].NumSerie);
    
        if not Assigned(wregistro60M) then
    
          raise Exception.Create(ACBrStr('Registro 60A sem registro 60M correspondente!'+#13+
    
            DateToStr(Registros60A[i].Emissao)+' - '+Registros60A[i].NumSerie));
    
        wregistro60M.Regs60A.Add(Registros60A[i]);
    
      end;
    
    
      //60D
    
      for i:=0 to Registros60D.Count - 1 do
    
      begin
    
        wregistro60M:=GetRegistro60M(Registros60D[i].Emissao,Registros60D[i].NumSerie);
    
        if not Assigned(wregistro60M) then
    
          raise Exception.Create(ACBrStr('Registro 60D sem registro 60M correspondente!'+#13+
    
            DateToStr(Registros60D[i].Emissao)+' - '+Registros60D[i].NumSerie));
    
        wregistro60M.Regs60D.Add(Registros60D[i]);
    
      end;
    
    
      //60I
    
      for i:=0 to Registros60I.Count - 1 do
    
      begin
    
        wregistro60M:=GetRegistro60M(Registros60I[i].Emissao,Registros60I[i].NumSerie);
    
        if not Assigned(wregistro60M) then
    
          raise Exception.Create(ACBrStr('Registro 60I sem registro 60M correspondente!'+#13+
    
            DateToStr(Registros60I[i].Emissao)+' - '+Registros60I[i].NumSerie));
    
        wregistro60M.Regs60I.Add(Registros60I[i]);
    
      end;
    
    
      //ordenando e gerando de acordo com o manual...
    
      Registros60M.Sort(Sort60M);
    
      for i:=0 to Registros60M.Count-1 do
    
      begin
    
        //removido pois sintegra tem ordem propria e nao consegui sortear os
    
        //objetos na lista de objetos com mais de um campo
    
    
        //    Registros60M[i].Regs60A.Sort(Sort60A);
    
        //    Registros60M[i].Regs60D.Sort(Sort60D);
    
        //    Registros60M[i].Regs60I.Sort(Sort60I);
    
    
        GerarRegistros60M(Registros60M[i]);
    
        GerarRegistros60A(Registros60M[i].Regs60A);
    
        GerarRegistros60D(Registros60M[i].Regs60D);
    
        GerarRegistros60I(Registros60M[i].Regs60I);
    
      end;
    
    end
    
    

    Gostaria de uma resolução para este problema, pois já tentei de todas as formas e não obtive sucesso.

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.