Como posso encontrar a localização de um erro “Índice de lista fora dos limites” no Delphi
-
19-09-2019 - |
Pergunta
No Delphi 2009, meu programa agora produz um erro "Índice de lista fora dos limites".Ele gera uma caixa pop-up:
(fonte: beholdgenealogy.com)
Estou usando a configuração de compilação "Debug" que tem toda a verificação de erros de tempo de execução ativada.Mas isso não captura o erro antes que aconteça.
Existe alguma maneira simples de localizar a origem desse erro no meu programa sem precisar inserir pontos de interrupção e restringi-lo por tentativa e erro?
Solução
Você tem "Stop On Delphi Exceptions" ativado? (Ferramentas Opções de depurador Exceções de Idioma [Delphi7]) Caso contrário, elas não serão divulgadas no seu SourceCode.
Também verifique se o Elisterror não está na sua lista "Tipos de exceção para ignorar". Esta lista também é encontrada no Ferramentas Opções de Debugger Exceções de Idioma (Delphi 7).
Outras dicas
Ei, você não precisa de ferramentas adicionais para rastrear isso! :)
Basta executar seu aplicativo sob depurador e garantir que "pare em exceções Delphi" (ou o que for chamado na versão do seu Delphi) está virado SOBRE.
Quando ocorrer exceção - haverá uma notificação do depurador. Pressione o botão "OK"/"Debug" e basta visualizar a pilha de chamadas. A janela de pilha de chamadas é mostrada automaticamente na versão recente do Delphi. Se você não puder vê -lo - vá para "View"/"Debug Windows"/"Call Stack".
Isso é tudo. A pilha de chamadas apontará você para o local exato do problema. Nenhuma ferramenta adicional necessária.
Essas ferramentas (Eurekalog, JCL ou Madexcept) são necessárias se você distribuir seu programa entre os usuários e desejar reunir relatórios sobre problemas no lado do cliente. Ou seja, não há depurador para verificar o problema.
Como esse é um erro RTL/VCL, você geralmente acaba com um melhor comportamento de quebra/pista de call se você ativar a depuração da DCU (e a reconstrução).
Alguma dica do que seu aplicativo está fazendo quando isso ocorre?Um longo ciclo?Um clique de botão?
Quando o aplicativo é interrompido e você olha a janela de depuração da pilha de chamadas, você consegue rastrear a chamada até a última chamada do seu código?A pilha de chamadas não informa todas as condições, mas pode restringir a localização.
Depois de restringir a chamada, uma ferramenta de registro como CódigoSite pode ser realmente útil.Por exemplo, frequentemente registro variáveis de controle de loop para descobrir qual iteração ocorre por último antes do erro, então é uma questão de identificar prováveis suspeitos.
Para ListBox, TStrings, ... significa que o índice está além da lista-> contagem ,. . exemplo de tString-> strnigs [?]; [?] <0 ou> (tString-> contagem-1) resultará em erro de limites.
Quanto ao nmpop3, etc, ... se usar o Pop3client para buscar e -mail, ele tem um bugs para alguns Unix/? Servidor POP3, que eu me deparei com ele para buscar e -mails no e -mail.
Por fim, tenho que reescrever meu aplicativo POP3Client com o TCLIFELTOCKET em vez do TNMPOP3. Agora funciona com todo o Pop3Server que eu conectei.
Espero que essa ajuda e boa sorte