$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.