Ir para conteúdo
  • Cadastre-se

dev botao

Commit revisão 23129 - Gerando exception


Ver Solução Respondido por José M. S. Junior,
  • Este tópico foi criado há 1145 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Bom dia

Referente ao Commit acima referenciado, após ele, começou a estourar exception.

Exception passa a ocorrer ao destruir o objeto fListaRetornoWeb do ACBrBoleto (linha 2762).

Atenciosamente.

 

 

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Consultores
Postado
3 horas atrás, Jéter Rabelo Ferreira disse:

Bom dia

Referente ao Commit acima referenciado, após ele, começou a estourar exception.

Exception passa a ocorrer ao destruir o objeto fListaRetornoWeb do ACBrBoleto (linha 2762).

Atenciosamente.

 

 

Bom dia, 

Consegue recriar no programa de demonstração e anexar aqui o fluxo evidenciando o problema onde ocorre o AV ?

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Postado
14 minutos atrás, Victor H. Gonzales - Panda disse:

Bom dia, 

Consegue recriar no programa de demonstração e anexar aqui o fluxo evidenciando o problema onde ocorre o AV ?

Boa tarde.

No momento eu não consigo fazer esse teste, mas segue a imagem da linha adicionada no commit em questão.

Até dia 30/09, que foi quando terminei os testes com a homologação do Banco Itaú WS estava tudo normal, sem problemas.

No sábado atualizei meu ACBr, e hoje fui fazer o teste na UNIT disponibilizada por você no outro POST a respeito disso, e me deparei com esse erro.

Ao depurar, encontrei onde estourava a exception, mas não ocorria semana passada.

Fui no LOG do SVN e encontrei um COMMIT adicionando a linha (imagem anexa), que, nesse caso, destrói o objeto que está na lista (ACBrBoleto.FListaRetornoWeb - Imagem anexa).

Nesse COMMIT, foi enviado apenas uma unit com apenas essa alteração (Imagem anexa)

Atenciosamente.

),image.png.69999957b9fbb1721c068d38b11f4fd9.pngimage.thumb.png.a194386e6030186d76429f1d1d1a746b.png

image.png

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Consultores
Postado
53 minutos atrás, Jéter Rabelo Ferreira disse:

Boa tarde.

No momento eu não consigo fazer esse teste, mas segue a imagem da linha adicionada no commit em questão.

Até dia 30/09, que foi quando terminei os testes com a homologação do Banco Itaú WS estava tudo normal, sem problemas.

No sábado atualizei meu ACBr, e hoje fui fazer o teste na UNIT disponibilizada por você no outro POST a respeito disso, e me deparei com esse erro.

Ao depurar, encontrei onde estourava a exception, mas não ocorria semana passada.

Fui no LOG do SVN e encontrei um COMMIT adicionando a linha (imagem anexa), que, nesse caso, destrói o objeto que está na lista (ACBrBoleto.FListaRetornoWeb - Imagem anexa).

Nesse COMMIT, foi enviado apenas uma unit com apenas essa alteração (Imagem anexa)

Atenciosamente.

),image.png.69999957b9fbb1721c068d38b11f4fd9.pngimage.thumb.png.a194386e6030186d76429f1d1d1a746b.png

image.png

Boa tarde,

Realmente o Objeto está criado ele precisa ser destruído.

Se está ocorrendo esse problema no Itau, faça o exemplo em um programa demo, onde ocorre a rotina de violação, para tentarmos detectar aqui.

Obrigado

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Postado
1 hora atrás, Victor H. Gonzales - Panda disse:

Boa tarde,

Realmente o Objeto está criado ele precisa ser destruído.

Se está ocorrendo esse problema no Itau, faça o exemplo em um programa demo, onde ocorre a rotina de violação, para tentarmos detectar aqui.

Obrigado

Boa tarde.

Efetuei o teste no programa do ACBr e o erro é o mesmo.

Ao fechar o programa, estoura exception.

Fui verificar esse problema, e ele é recorrente em commit's de retira e coloca o .free.

20/07/Commit: 22415 Foi criada a property: fRetornoWeb: TRetEnvio;, colocado no Create/Destroy do ACBrTitulo.
25/08/Commit: 22775 - Destroy comentado
26/08/Commit: 22791 - Linha do destroy excluída
01/10/Commit: 23129 - Linha adicionada novamente - Problema de Access Violation

Em suma, o problema existe e está ocorrendo, mesmo no programa do ACBr de exemplo.

Atenciosamente.


 

 

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Consultores
Postado
var ACBrBoleto: TACBrBoleto;

ACBrBoleto := TACBrBoleto.Create(Self);
ACBrBoleto.Free;

somente o fato de fazer isso o AV sobe?

 

Ele foi removido nos commits anteriores referente a outro problema mapeado.

Mas realmente todo objeto criado ele tem que ser destruído, então ele tem que conter ali no destroy, se está ocorrendo AV em outro ponto, preciso da simulação, pois aqui só o fato de criar o componente e destruir ele não ocorre nenhuma AV, ou se eu insiro titulo ou limpo a lista não ocorre problemas.

Qual a rotina que o AV ocorre?

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Postado
38 minutos atrás, Victor H. Gonzales - Panda disse:
var ACBrBoleto: TACBrBoleto;

ACBrBoleto := TACBrBoleto.Create(Self);
ACBrBoleto.Free;

somente o fato de fazer isso o AV sobe?

 

Ele foi removido nos commits anteriores referente a outro problema mapeado.

Mas realmente todo objeto criado ele tem que ser destruído, então ele tem que conter ali no destroy, se está ocorrendo AV em outro ponto, preciso da simulação, pois aqui só o fato de criar o componente e destruir ele não ocorre nenhuma AV, ou se eu insiro titulo ou limpo a lista não ocorre problemas.

Qual a rotina que o AV ocorre?

Boa tarde.

Fiz um vídeo mostrando, Ficou sem o áudio, mas dá para verificar o problema.

Atenciosamente

 

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Consultores
Postado
30 minutos atrás, Jéter Rabelo Ferreira disse:

Boa tarde.

Fiz um vídeo mostrando, Ficou sem o áudio, mas dá para verificar o problema.

Atenciosamente

 

 

consegue criar um botão no demo, com a rotina que faz o Exception e me enviar (se é criação do componente, inclusão de titulo, se é alguma rotina que você faz, coloque a receita do bolo por favor) ?

vou tentar mapear essa questão

na verdade não é um AV que você está tendo, e sim um Invalid Pointer, porque o objeto está tendo free 2 vezes.

que é no destroy ali já estou ciente do caso, só preciso saber onde está ocorrendo isso, pode ser algo relacionado no Itau, mas não deveria.

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Postado
13 minutos atrás, Victor H. Gonzales - Panda disse:

 

consegue criar um botão no demo, com a rotina que faz o Exception e me enviar (se é criação do componente, inclusão de titulo, se é alguma rotina que você faz, coloque a receita do bolo por favor) ?

vou tentar mapear essa questão

na verdade não é um AV que você está tendo, e sim um Invalid Pointer, porque o objeto está tendo free 2 vezes.

que é no destroy ali já estou ciente do caso, só preciso saber onde está ocorrendo isso, pode ser algo relacionado no Itau, mas não deveria.

Eu fiz mais um vídeo demonstrado o problema.

 

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Consultores
Postado

Aberto TK-1987

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

  • Consultores
Postado

Testa com essa unit por favor

ACBrBoleto.pas

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

Postado

Bom dia.

A correção que você fez não alterou em nada o problema, visto que, ao efetuar o fListaBoletos.free, eu destruo o ítem da lista,

Portanto, estamos dando voltas num problema, tentando resolver o problema, cuja a causa não está no destroy, mas onde a referência é feita?

Efetuei um debug e encontrei o local do problema. Vocês estão simplesmente atribuindo o ítem da listaretornoWeb no objeto RetornoWeb do títulos.

Ao efetuar o free da lista do título, automaticamente essa referência é destruída, aí estoura a exception. 

Segue imagem onde essa atribuição do objeto está sendo feita.

Atenciosamente.

image.thumb.png.244edeb4e8966c00b13c4cdba3eaea03.png

 

 

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Consultores
Postado
8 minutos atrás, Jéter Rabelo Ferreira disse:

Bom dia.

A correção que você fez não alterou em nada o problema, visto que, ao efetuar o fListaBoletos.free, eu destruo o ítem da lista,

Portanto, estamos dando voltas num problema, tentando resolver o problema, cuja a causa não está no destroy, mas onde a referência é feita?

Efetuei um debug e encontrei o local do problema. Vocês estão simplesmente atribuindo o ítem da listaretornoWeb no objeto RetornoWeb do títulos.

Ao efetuar o free da lista do título, automaticamente essa referência é destruída, aí estoura a exception. 

Segue imagem onde essa atribuição do objeto está sendo feita.

Atenciosamente.

image.thumb.png.244edeb4e8966c00b13c4cdba3eaea03.png

 

 

Bom dia,

Reproduza o problema no programa exemplo e anexe o mesmo aqui por favor.

Não é questão de voltas, eu não tenho o mesmo cenário que o seu para simular, não sei os passos exatos que você está fazendo até consumir esse problema (envio, consulta, alteração), só está sendo evidenciado onde está sendo ocasionado, mas não os passos antecessores.

A simulação do problema do invalid pointer foi detectada e tratada utilizando o banco do brasil via API, é o que tenho aqui no meu ambiente no momento, os tratamentos não geraram mais invalid pointer, como tambem não gerou mais access violation.

A Alteração não foi somente no destroy, mas também no create, onde o owner é individual, aqui no cenário não existe esse problema simulado, portanto volto a pedir por favor, faça um botão no programa de exemplo, com a rotina toda que faz essa exceção levantar, anexe aqui para analise.

Obrigado

Consultor SAC ACBr

Victor H Gonzales - Pandaaa
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

"Aprender é a única coisa que a mente nunca se cansa, nunca tem medo e nunca se arrepende” - Leonardo da Vinci

"Ter sucesso é falhar repetidamente, mas sem perder o entusiasmo"

  • Fundadores
Postado

Atribuir um Objeto a outro, realmente apenas copia a referencia dele... e se o Objeto original é destruído, todas as referências que apontavam para ele, ficam inválidas.. (access violation)

Para "Clonar" um Objeto, seria necessário criar um método Assign, ou varrer as propriedades dele, e copiar no novo objeto..

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Fundadores
Postado

Apenas para exemplificar.. esse trecho de código, produz um A.V.

procedure TForm1.Button1Click(Sender: TObject);
var
  SL1, SL2: TStringList;
  S: String;
begin
  SL1 := TStringList.Create;
  try
    SL1.Add('teste');
    SL2 := SL1;
  finally
    SL1.Free;
  end;

  S := SL2.Text;  // A.V. aqui
end;  

 

Já esse copia (clona) o conteúdo de um Objeto para o Novo...

procedure TForm1.Button2Click(Sender: TObject);
var
  SL1, SL2: TStringList;
  S: String;
begin
  SL2 := TStringList.Create;
  try
    SL1 := TStringList.Create;
    try
      SL1.Add('teste');
      SL2.Text := SL1.Text;
    finally
      SL1.Free;
    end;

    S := SL2.Text;  // tudo OK
  finally
    SL2.Free;
  end;
end;  

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Postado
43 minutos atrás, Daniel Simoes disse:

Atribuir um Objeto a outro, realmente apenas copia a referencia dele... e se o Objeto original é destruído, todas as referências que apontavam para ele, ficam inválidas.. (access violation)

Para "Clonar" um Objeto, seria necessário criar um método Assign, ou varrer as propriedades dele, e copiar no novo objeto..

@Daniel Simoes, é o que eu estou tentando dizer, mas não estou sendo interpretado corretamente.

No meu post acima, eu mostrei a origem do problema.

Agora eu efetuei o teste, clonando o objeto, e não atribuindo o mesmo.

Nós temos um objecthelper interno de uso nosso que clonamos qualquer tipo de objecto.

Fizemos esse clone na linha acima e, voi-lá, sem exception.

Segue imagem.image.thumb.png.a499b827862bdb4361c47a9eecdfa9aa.png

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

Postado
45 minutos atrás, José M. S. Junior disse:

@Jéter Rabelo Ferreira, segue uma possível correção para esse caso. Se possível realize o teste com essa Unit em anexo.

 

ACBrBoletoWS.zip 7 kB · 0 downloads

@José M. S. Junior, vi que foi criado um método para copiar o conteúdo do objeto, ao invés de atribuição. Problema resolvido.

Porém, fica uma dica minha, numas das alterações feitas no ACBrBoleto.pas, o parâmetro do create FListaRetornoWeb foi modificado:
FListaRetornoWeb := TListaRetEnvio.Create(False); 

No Destroy está correto, fazendo um for destruindo cada um objeto da lista.
   for I := Pred(fListaRetornoWeb.Count) downto 0 do
     fListaRetornoWeb[I].Free;

 

Porém, se mudar para
FListaRetornoWeb := TListaRetEnvio.Create(True);, não haverá a necessidade de fazer isso e, o mais importante, quando fizer um FBoleto.ListaRetornoWeb.Clear; (ACBrBoletoWS), não haverá memory leak, pois o TObjectList se encarregará de fazer essa limpeza. Da forma que ficou, haverá ML no clear caso haja algum item na lista.

Muito obrigado pela atenção.

Atenciosamente.

@José M. S. Junior

Eu acho que essa alteração do Post acima não foi enviada ao repositório. 

Se não foi, desconsidere.

Muito obrigado

Atenciosamente.

------------------------------------------------

Jéter Rabelo Ferreira
Campestre/MG

  • Fundadores
Postado

@Jéter Rabelo Ferreira, eu sugeri um novo código ao @José M. S. Junior, usando Assign nas classes...

Ainda estamos trabalhando nisso...

19 horas atrás, Jéter Rabelo Ferreira disse:

FListaRetornoWeb := TListaRetEnvio.Create(True);, não haverá a necessidade de fazer isso e, o mais importante, quando fizer um FBoleto.ListaRetornoWeb.Clear; (ACBrBoletoWS), não haverá memory leak, pois o TObjectList se encarregará de fazer essa limpeza. Da forma que ficou, haverá ML no clear caso haja algum item na lista.

Sim.. isso faz todo Sentido.. a vantagem de usar Listas de Objeto é justamente deixar elas gerenciarem os itens contidos nela

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

  • Este tópico foi criado há 1145 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.