Dans Delphi 2009, mon programme produit désormais une erreur d'erreur "index de liste hors limites". Il génère une boîte de popup: p>
J'utilise la configuration de construction "debug" qui contient toutes les erreurs d'exécution vérifiées activées. Mais cela ne capture pas l'erreur avant d'arriver. P>
Y a-t-il un moyen simple de localiser la source de cette erreur dans mon programme sans avoir à mettre dans les points d'arrêt et à le réduire en baisse par essai et par erreur? P>
(Source: CORELOLGENEALOGY.COM ) SUB> P>
6 Réponses :
Toute astuce Quelle est votre application lorsque cela se produit? Une longue boucle? Un bouton cliquez sur? P>
Lorsque l'application s'arrête et que vous examinez la fenêtre de débogage de la pile d'appels, pouvez-vous retrouver le rappel au dernier appel de votre code? La pile d'appels ne vous dira pas toutes les conditions, mais peut réduire l'emplacement. P>
Une fois que vous avez affaibli l'appel, un outil de journalisation comme Codesite peut être vraiment utile. Par exemple, je me connecte souvent les variables de contrôle de boucle pour déterminer quelle itération se produit enfin avant l'erreur, il s'agit d'identifier les suspects probables. P>
Je sais que c'est une erreur hors limites dans l'une des nombreuses TLISTES que mon programme ou un composant dans mon programme utilise. Je suis surpris que la vérification des limites ne attrape pas cela. L'application ne s'arrête pas. Il continue après que j'appuie sur le bouton OK, mais avec certaines fonctionnalités manquantes. Si je pouvais trouver l'appel, je saurai où l'erreur est. Mais il trouve l'appel qui est difficile.
La vérification des limites ne l'attraperait pas car la vérification des limites s'applique aux opérations arithmétiques (débordement). Vous voulez dire une vérification de la plage, mais la vérification de la plage ne peut pas i> l'attraper parce que cela ne s'applique que pour les tableaux, pas les classes. Le message d'erreur que vous voyez est le résultat de la liste de la classe de liste "Vérification de la plage".
Pourriez-vous ajouter un bouton et une méthode ci-jointe qui affiche une valeur de chacun de vos tlistes? Peut-être que celui qui ne montre pas est celui qui est mort? Cela le ferait-il tomber en panne? Je conviens que cela pourrait finalement être moins de travail pour se familiariser avec l'outil de débogage JCL, MakeXcept ou Eurekalog, car le bon outil trouve de nombreuses utilisations ...
Une correction à mon commentaire précédent. Delphi n'a rien d'officiellement connu sous le nom de Bounds i> Vérification; Je pensais Overflow i> Vérification. Dans la mesure où la vérification de la plage et la vérification des limites sont des synonymes, vous aviez raison d'appeler la vérification des limites informatiques. L'essentiel est qu'aucune option de compilateur ne pourrait contrôler la détection de ce problème car elle implique une classe de liste et non un tableau.
madexcept (gratuit) ou Eurekalog (payé) peut aider. Vous pouvez les configurer pour afficher / envoyer une trace de pile lorsqu'une erreur se produit. J'utilise Eurekalog dans tous mes projets et il est inestimable de fixer ce genre de choses. P>
FYI MadeXcept est uniquement libre pour une utilisation non commerciale.
Je présume que l'un de ces programmes (je n'ai jamais essayé) fonctionnera. Mais ils sont un peu trop exclusifs si je ne veux pas ajouter une déclaration d'erreur améliorée dans mon colis distribuable. Je peux y aller avec l'un d'entre eux (toutes les recommandations quelles sont meilleures?), Mais j'espérais vraiment une solution plus simple.
Le JCL a une offre similaire et est vraiment gratuit.
J'ai utilisé MakedXcept, mais préfère maintenant Eurekalog. Je n'ai pas essayé l'alternative JCL. Ils sont raisonnables non invasives, vous obtenez un EXE plus grand, mais c'est à peu près tout. Il est assez facile de les activer / désactiver si vous ne voulez pas les inclure dans votre distribution. Je vous recommande de le faire, vous trouverez des bugs que vous n'avez jamais connu.
@Seanx: JCL peut également utiliser des informations de débogage externes afin que vous n'ayez pas besoin d'avoir un EXE plus important. J'habille que les autres alternatives ont la même option.
J'ai utilisé MakeXcept pendant de nombreuses années maintenant. Rien ne vous oblige à déployer l'utiliser. Vous pouvez l'utiliser uniquement pour vos constructions internes, puis éteignez facilement le complément de vos constructions de production. Si vous utilisez un système de construction (terminal Builder), l'ajout de MakedXcept à votre projet est une étape supplémentaire de toute façon.
Avez-vous "Arrêtez-vous sur les exceptions Delphes" activés? (Outils \ Options de débogueur \ Exceptions linguistiques [Delphi7]) Sinon, il ne se cassera pas dans votre SourceCode. P>
Assurez-vous également que ElistRor n'est pas dans votre liste "Types d'exception à ignorer". Cette liste est également trouvée dans Outils \ Options de débogueur \ Exceptions de langue (Delphi 7). P>
C'est une autre version (venue après Alexander) de la réponse simple que je cherchais. Je vais vérifier quand je rentrerai à la maison plus tard aujourd'hui.
Selon donc, j'ai répondu à une heure plus tôt;) Et je n'ai pas vu Alexanders Répondez quand j'ai posté le mien. Donc, j'étais le premier: p
Intéressant. Doit être une chose de fuseau horaire qui vous trompe. Il vous dit que vous avez répondu il y a 14 heures et Alexander a répondu il y a 13 heures. Mais quand je trie le plus ancien d'abord, le vôtre vient de l'avant, alors vous devez en effet avoir été d'abord.
À Delphi 2009, il est en fait sous Outils \ Options \ Exceptions linguistiques. "Notifier sur les exceptions de langues" a été vérifiée par défaut, de sorte que ça allait bien. Mais Elisterror était dans la liste des ignorés. Décocher cela et Delphi maintenant piétiné l'erreur. Je peux le casser et obtenir la pile d'appels. Merci. C'est ce que je cherchais.
En effet, quand j'ai vu la réponse de la First et la précipitée, Alexander n'avait pas encore été posté.
Comme il s'agit d'une erreur RTL / VCL, vous vous retrouvez souvent avec un comportement de rupture / CallStack meilleur si vous activez le débogage de DCU (et de la reconstruction). P>
N'avait pas besoin de l'essayer (voir la solution ci-dessus), mais merci pour l'idée.
Hey, vous n'avez besoin d'aucun outil supplémentaire pour suivre cela! :) p>
Exécutez votre application sous le débogueur et assurez-vous que "Arrêter sur les exceptions Delphes" (ou tout ce que l'on appelle dans la version de votre Delphi) est transformé Lorsque l'exception se produit - il y aura une notification de débogueur. Appuyez sur le bouton "OK" / "Débogage" et affichez simplement la pile d'appels. La fenêtre d'appel de la pile est affichée automatiquement dans la version de Delphi récente. Si vous ne pouvez pas le voir - allez à "Afficher" / "Débogou Windows" / "Stack d'appel". P>
C'est tout. La pile d'appel vous pointera à l'emplacement exact du problème . Aucun outil supplémentaire nécessaire. P>
Ces outils (Eurekalog, JCL ou MADXCEPT) sont nécessaires si vous distribuez votre programme parmi les utilisateurs et que vous souhaitez recueillir des rapports de bugs sur les problèmes de la clientèle. C'est à dire. Il n'y a pas de débogueur pour vérifier le problème. P>
Je vois aussi un étrange mot non standard dans la légende: "voici";)
Espérons que "voici" sera bientôt une norme. :-)
Ceci est une version de la réponse simple que je cherchais. Je vais vérifier quand je rentrerai à la maison plus tard aujourd'hui.
"Espérons que" voici "sera bientôt un standard" - en fait, je veux dire que vous pouvez essayer de localiser cette chaîne dans vos sources et que vous pourriez y avoir un indice. C'est tout: D
Voici le nom de mon programme. Mon programme utilise la convention standard (par exemple en tant que bloc-notes) de définir la légende du formulaire principal au nom du fichier ouvert suivi d'un tableau de bord suivi du nom du programme. La légende de cette boîte popup semble avoir hérité de la légende de la forme principale de mon programme. Donc, cela n'aurait pas aidé à trouver l'erreur - mais c'était une bonne idée possible. ... Et c'est pourquoi je dis que j'espère que "voir" sera bientôt une norme.
Pour ListBox, TRNStrings, ... signifie que l'index est au-delà de la liste-> Count ,. . Exemple de Tstring-> Strnigs [?]; [?] est <0 ou> (TString-> Count-1) résultera d'une erreur de limites. P>
comme pour nmpop3, etc, ... Si vous utilisez POP3Client pour aller chercher un courrier électronique, il a un bugs à un peu unix /? POP3 Server, que j'ai rencontré l'utiliser pour aller chercher des courriels de mail.???.com mais ok avec certains. p>
enfin, je dois réécrire mon application POP3Client avec TCLIdaCockat au lieu de TNMPOP3. Fonctionne maintenant avec tous les POP3Server que j'ai connecté à. P>
J'espère que cette aide et bonne chance p>
Un autre +1 à empiler débordement, pour fournir un forum et les autres experts qui m'a aidé rapidement à passer un problème que je n'aurais pas facilement trouvé la solution à moi-même.
D'accord. Je ne comprends tout simplement pas pourquoi mon haut-vote n'apporte que cette question à zéro. Coup d'écran bien indiqué et élit de bonnes réponses. Je ne comprends tout simplement pas.
Je suppose que si je voulais des upvotes, j'aurais dû demander quelque chose comme: "Quel est ton dessin animé de Delphi préféré". Heureusement, tout ce que je voulais, c'était une solution à mon problème.