Como lidar com erros de “access violation at address in module” em Delphi

Todo programador Delphi algum dia já precisou lidar com um erro de Access Violation aparecendo na tela de seu sistema. Esse tipo de erro é tão comum que já até ganhou o carinhoso apelido de “AV”. Estes erros, também conhecidos por falhas de segmentação , ocorrem quando alguma parte do software tenta acessar um endereço de memória inválido, ou que já esteja em uso.

Os AV’s são erros que podem tirar o sono de um programador, pois apesar de serem – na maioria dos casos – simples de resolver, eles são muito difíceis de serem encontrados. Por ocorrerem apenas em tempo de execução, e às vezes aleatoriamente, a correção deste tipo de erro exige uma certa experiência do programador na linguagem.

Uma maneira comum de ocorrer um AV é quando tentamos acessar um método de um objeto que ainda não foi instanciado. Neste caso a solução é simples, bastando instanciar o objeto corretamente para depois acessar seu método.

Outra maneira, um pouco mais complicada, ocorre quando tentamos referenciar um ponteiro nulo. Traduzindo, podemos dizer que alguém tentou acessar algo que não existia mais, e assim ocorre o AV. Os AV’s são comuns de aparecer em recursões com criação dinâmica de objetos, ou quando liberamos um objeto com muitos outros vinculados a ele, por exemplo, quando fechamos um formulário. Ao tentar destruir o objeto principal, se algum dos objetivos vinculados já tiver sido destruído, o seu vínculo ao objeto principal ainda existirá. Por esse vínculo o sistema tenta destruir o objeto novamente, causando o AV. Nestes casos, é comum que os AV’s venham acompanhados de Memory Leaks, que causam um consumo exagerado de memória por parte do sistema, sem a posterior liberação da mesma.

Um problema grave com os AV’s, e que tira o sono de programadores, é que na maioria das vezes eles são difíceis de serem reproduzidos. E quando um programador não consegue reproduzir um erro, o trabalho para corrigí-lo é muito maior.

Para tentar minimizar este problema surgiram algumas ferramentas que ajudam programadores Delphi a encontrar os AV’s e corrigí-los. São as ferramentas de log de erros, como o MadExcept ou o EurekaLog . As duas fazem o mesmo trabalho de analisar os dados gerados pelo software e identificar pontos onde as falhas ocorrem, dando ao programador informação relevante para que ele possa encontrar o ponto no código no qual os erros estão ocorrendo.

Estas ferramentas não são balas de prata que resolverão todos os casos, porém através delas o tempo gasto para encontrar e corrigir um Access Violation pode ser bem menor.

Uma outra abordagem mais proativa é utilizarmos processos que garantam a qualidade de nosso software, como o Desenvolvimento Orientado a Testes (TDD) e a Integração Contínua. Ao utilizar estes processos em seu dia a dia o programador passa a ter ferramentas que garantem que os problemas de Access Violation e outros serão encontrados mais rapidamente, pois os testes são rodados a todo momento e quando um erro for injetado no código, ele será detectado quase que imediatamente.