Como posso encontrar a localização de um erro “Índice de lista fora dos limites” no Delphi

StackOverflow https://stackoverflow.com/questions/1191604

Pergunta

No Delphi 2009, meu programa agora produz um erro "Índice de lista fora dos limites".Ele gera uma caixa pop-up:

alt text
(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?

Foi útil?

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

Madexcept (grátis) ou Eurekalog (pago) pode ajudar. Você pode configurá -los para mostrar/enviar um rastreamento de pilha quando ocorrer um erro. Eu uso o Eurekalog em todos os meus projetos e é inestimável para consertar esse tipo de coisa.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top