Ir para conteúdo
  • Cadastre-se

dev botao

Access Violation ACBrMTer + Balança Prix Fit 3


Ver Solução Respondido por William F. L.,
  • Este tópico foi criado há 248 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá, estamos com um cliente usando o microterminal Gertec MT-721 integrado a Balança Prix Fit 3.

Em alguns momentos do dia, estoura na tela do caixa uma mensagem acusando "Access Violation" na linha 109 da unit "ACBrBALToledo.pas":

exception class    : EAccessViolation
exception message  : Access violation at address 01876215 in module 'WFOOD.exe'. Read of address 00000000.

main thread ($82c):
01876215 +029 WFOOD.exe    ACBrBALToledo          109  +4 TACBrBALToledo.ProtocoloP03Detectado
01876d7d +0b9 WFOOD.exe    ACBrBALToledo          365 +10 TACBrBALToledo.InterpretarRepostaPeso
0188409b +017 WFOOD.exe    ACBrBAL                389  +1 TACBrBAL.InterpretarRepostaPeso
0188b458 +16c WFOOD.exe    ACBrMTer               598 +29 TACBrMTerConexao.OnBufferWaitDone
01466eed +011 WFOOD.exe    ACBrBase               525  +1 TACBrThreadTimer.DoCallEvent
0055f75e +172 WFOOD.exe    System.Classes                 CheckSynchronize
007274b0 +7bc WFOOD.exe    Vcl.Forms                      TApplication.WndProc

 

Método apontado na exceção "ProtocoloP03Detectado" como a linha 109:

function TACBrBALToledo.ProtocoloP03Detectado(const  wPosIni:Integer; const aResposta: AnsiString): Boolean;
var
  l_posini, l_posfim: Integer;
begin
  // detecta o padrão p03 na string.
  //                   1     2      3    4    567890   123456    7    8 (8 é opcional)
  // Protocolo P03 = [STX] [SWA] [SWB] [SWC] [IIIIII] [TTTTTT] [CR] [CS]
  if  (aresposta[1] = STX) and (aresposta[17] = CR) then <---------- ERRO SERIA NESSA LINHA 109
      // primeiro caracter da string é STX e o 17 é CR
    Result := True
  else
  begin
    // pode ocorrer da string ser lida quebrada, assim procura o primeiro CR, depois do primeiro STX
    // [IIII] [STX] [SWA] [SWB] [SWC] [IIIIII] [TTTTTT] [CR]
    l_posini := Pos(STX, aResposta);
    l_posfim := PosEX(CR, aResposta, l_posini + 1);
    if  l_posfim = 0 then
      l_posfim := Length(aResposta) + 1;

    Result := l_posfim - l_posini = 16;
  end;
end;

 

Analisando os logs do microterminal nos horários em que ocorre o erro, observamos que todas as vezes que houve erro foi no trecho abaixo:

 -- 23/06 14:23:45:122 -- Terminal: 192.168.30.5 - RX <- 262 bytes -> =[NUL][STX][SOH][NUL][STX]00000[ETX][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL][7]

 

image.png.7b12b65221605b4e2ee1b0693683f18d.png

Sistemas para Bares, Restaurantes e Varejo

https://www.wllsistemas.com.br

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa noite,

A variável aResposta deve estar vindo em branco e, ao tentar acessar a posição do primeiro char, que não existe, gera o AV.

Para simular o erro, para verificar se é isso, force a mesma situação com uma variável em branco.

var
  aRespostaTeste: AnsiString;
begin
  aRespostaTeste := '';
  if (aRespostaTeste[1] = STX) and (aRespostaTeste[17] = CR) then
    

Se for esse o problema, coloque a condição abaixo para não acontecer mais.

Reinstale os componentes após as alterações.

if (aresposta <> '') and <<<
  (aresposta[1] = STX) and (aresposta[17] = CR) then <---------- ERRO SERIA NESSA LINHA 109

Estando ok, anexe a unit corrigida para envio ao SVN.

Link para o comentário
Compartilhar em outros sites

Bom dia Renato, fiz essa alteração sugerida conforme o print abaixo e vou colocar no cliente para testar:

image.thumb.png.2f4506641f9476c19f0fa39a83986577.png

 

Porém acho que a verificação se a "resposta" está vazia deveria ser feito na função que interpreta as respostas "InterpretarRespostaPeso", nessa função existe uma verificação de "aResposta" mas está no meio da função, podendo ocasionar erros antes dessa verificação:

image.thumb.png.93dff809973b583b59ef648304f0d73a.png

 

image.png.7b12b65221605b4e2ee1b0693683f18d.png

Sistemas para Bares, Restaurantes e Varejo

https://www.wllsistemas.com.br

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bom dia,

1 hora atrás, William F. L. disse:

Porém acho que a verificação se a "resposta" está vazia deveria ser feito na função que interpreta as respostas "InterpretarRespostaPeso",

Concordo, inclusive acredito que sua validação poderia ser colocada no início da função, pois se aResposta estiver em branco não existe necessidade das demais validações.

1 hora atrás, William F. L. disse:

fiz essa alteração sugerida conforme o print abaixo e vou colocar no cliente para testar:

De qualquer forma mantenha a correção feita também onde ocorria o AV.

Validando no cliente, por favor anexe os fontes para análise e envio ao SVN.

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Consultores

Boa noite,

Fiz dois ajustes:

  • Coloquei o tratamento também na ProtocoloP03Detectado, pois ela é o local do AV e assim prevenimos que alguma outra chamada dela traga o mesmo problema.
  • Coloquei a verificação da wResposta para também sair caso tenha retornado em branco ao interpretar os protocolos.

Foi enviado ao SVN na Rev-30238

Por favor, queira atualizar seus fontes, reinstalar o ACBr, verificar e reportar se ficou tudo ok.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Este tópico foi criado há 248 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.