Comment puis-je trouver l'emplacement d'une erreur « index de la liste hors limites » dans Delphi

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

Question

Dans Delphi 2009, mon programme produit maintenant une erreur « index de liste hors des limites ». Il génère une boîte de pop-up:


(source: beholdgenealogy.com )

J'utilise la configuration Créer « Debug » qui a tout l'erreur d'exécution vérification activée. Mais cela ne tient pas compte de l'erreur avant qu'elle ne survienne.

est-il un moyen simple de localiser la source de cette erreur dans mon programme sans avoir à mettre en points d'arrêt et le réduire par tâtonnement?

Était-ce utile?

La solution

Avez-vous "Stop sur les exceptions Delphi" sous tension? (Outils \ Options Débogueur \ Language Exceptions [Delphi7]) Sinon, il ne se cassera pas dans votre code source.

Assurez-vous également que EListError est pas dans vos « Types d'exceptions à ignorer » la liste. Cette liste se trouve également dans Outils \ Options Débogueur \ Language Exceptions (Delphi 7).

Autres conseils

madExcept (libre) ou EurekaLog (payant) peut aider. Vous pouvez les configurer pour afficher / courriel une trace de la pile lorsqu'une erreur se produit. J'utilise EurekaLog dans tous mes projets et il est précieux pour la fixation de ce genre de choses.

Hé, vous n'avez pas besoin d'outils supplémentaires pour suivre ce! :)

Il suffit de lancer votre application sous débogueur et assurez-vous que « Arrêt sur les exceptions Delphi » (ou quoi que ce soit appelé dans votre version de Delphi) est activé .

Quand exception se produit - il y aura une notification du débogueur. Appuyez sur le bouton « Ok » / « Debug » et juste afficher la pile d'appel. fenêtre de la pile d'appel est automatiquement affiché dans la version récente de Delphi. Si vous ne pouvez pas le voir -. Allez dans "View" / "Debug Windows" / "pile d'appel"

C'est tout. La pile d'appel vous indiquera à l'endroit exact du problème . Aucun outil supplémentaire nécessaire.

Ces outils (EurekaLog, JCL ou madExcept) sont nécessaires si vous distribuez votre programme parmi les utilisateurs et que vous voulez recueillir des rapports de bugs sur les problèmes du côté client. C'est à dire. il n'y a pas débogueur pour vérifier le problème.

Comme cela est une erreur RTL / VCL, vous vous retrouvez souvent avec un meilleur comportement à la rupture / callstack si vous activez (et reconstruisez) de débogage DCU.

Les conseils de ce que fait votre application lorsque cela se produit? Une longue boucle? Un bouton clic?

Lorsque les arrêts d'application et vous regardez la fenêtre de débogage de la pile d'appel, pouvez-vous tracer l'appel vers le dernier appel de votre code? La pile d'appel ne vous dira pas toutes les conditions, mais peut restreindre l'emplacement.

Une fois que vous affinez l'appel, un outil d'enregistrement comme CodeSite peut être vraiment utile. Par exemple, je me connecte souvent variables de contrôle de boucle pour déterminer quelle itération se produit la dernière avant que l'erreur, il est une question d'identifier les suspects probables.

pour listbox, TStrings, ... signifie que l'indice est au-delà de la list-> comte. . exemple de tString-> strnigs [?]; [?] Est <0 ou> (tString-> count-1) se traduira par une erreur de limite.

comme pour NMPop3, etc, ... si l'utilisation pop3client à récupérer e-mail, il a quelques bugs à certains unix /? serveur pop3, que je suis tombé sur de l'utiliser pour aller chercher courriel de mail.???.com mais ok avec certains.

enfin, je dois réécrire mon application pop3client avec TClientSocket au lieu de tnmpop3. fonctionne maintenant avec tous des Pop3Server que je connecté.

espérons que cette aide et bonne chance

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top