Pergunta
· Mar. 19, 2022

$GET causando acesso de segmento inválido de memória

Antes de mais nada, o exemplo abaixo trata-se da manutenção de um código legado e em uma nova implementação não usaria a ^CacheTemp dessa forma.

Em determinado momento na codificação, realizamos um $GET em uma variavel do tipo global na CacheTemp da seguinte forma:

Set dataHora = $GET(^CacheTemp.ResAnteriores("DataColeta",pUsuario,pSessao,paciente,objOs.%Id(),pProcedimento),"")

Sendo que a global, nesses termos, está <UNDEFINED>, porém em tempo de execução o retorno é um dump de memoria, fazendo com que nos logs de console (cconsole.log) o erro abaixo seja apresentado e o processo seja interrompido abruptamente:

03/19/22-08:55:53:856 (751) 3 Process 751 (JobType=Background job,Dumpstyle=0,Directory='/dados/LIS/') caught signal 11. 
03/19/22-08:55:53:857 (751) 3 Parent process will clean up and halt
03/19/22-08:55:53:857 (751) 3 If core dumps are enabled, a core file will be created by process 752 in the location specified by the system configuration.

Para solucionar o problema, removi o ,"") como parametro para o $GET, uma vez que esse parametro já é definido dessa forma como padrão e isso resolveu o problema.

Ficando da seguinte forma:

Set dataHora = $GET(^CacheTemp.ResAnteriores("DataColeta",pUsuario,pSessao,paciente,objOs.%Id(),pProcedimento))

Eu gostaria de entender o motivo desse problema, uma vez que foi possível observar "comportamentos estranhos", segue algumas observações:

O problema NÃO ocorre quando faço as seguintes ações:

  • Duplicar qualquer linha de código desse método;
  • Adicionar qualquer modificação a global, seja globais persistentes (^EXAMPLE) , globais cache temp como essa do exemplo ou globais de processo (^||EXAMPLE) antes ou depois da linha, dentro ou fora do método, mas sempre dentro do fluxo do processo;
  • Adicionar qualquer estrutura de código como IF, WHILE, FOR etc

IMPORTANTE: Espaços em branco não resolvem o problema, o erro continua ocorrendo e algumas linhas como "Set exemple = 1" apenas para forçar modificação também não resolvem.

Segue um print para demonstrar o problema ocorrendo em um debug do processo anexado diretamente no STUDIO.

É possível perceber que no mesmo momento, o terminal retorna "" onde na depuração linha a linha retorna um DUMP de memória aleatória.

Após isso, ao seguir para a proxima linha o processo é interrompido e a mensagem no cconsole.log é apresentada.

Product version: Caché 2018.1
$ZV: Cache for UNIX (Red Hat Enterprise Linux for x86-64) 2018.1.5 (Build 659_0_20955U) Wed Jun 23 2021 15:16:00 EDT
Discussão (1)0
Entre ou crie uma conta para continuar

Olá Arian. 
O erro apresentado em tempo de depuração não parece ter a ver com o $GET. Você tentou verificar os valores dos pieces da global antes ? Uma sugestão, caso ainda não tenha feito, é verificar a variável %objlasterror antes e depois da execução da linha para confirmar o erro . E vale a pena verificar se teve algum registro do processo no arquivo messages.log  que fica na pasta /mgr.