Cela semble être la chose la plus simple au monde et je suis prêt à tirer mes cheveux dessus.
J'ai une unité qui ressemble à ceci; p> C'est une simple affectation d'une variable et je n'ai aucune idée de la raison pour laquelle cela fait cela. J'ai essayé de déclarer la variable locale à l'unité, à la procédure, à l'échelle mondiale - peu importe où j'essaie de le faire, je ne peux pas attribuer une valeur de zéro à un entier, déclarée nulle part, dans cette procédure sans qu'il soit en train de lancer un accès violation. Je suis totalement excentré. P> J'appelle la procédure de l'intérieur d'un bouton de la même unité, mais peu importe où je l'appelle à partir de celle-ci jette l'exception. La folle est que je fais exactement la même chose dans une douzaine d'autres endroits en unités dans tout le programme sans problèmes. Pourquoi ici? Je suis à une perte totale. p> p>
5 Réponses :
Déplacez MyCounter en haut de la liste Var et voyez s'il arrive toujours. Si le problème disparaît, regardez les Vars déclarés ci-dessus où vous l'avez maintenant - vous pouvez trouver quelque chose d'intéressant, tel qu'un tableau de croissance dépassant sa frontière. P>
Cela ne causera pas de violation d'accès pour accéder à une variable simple.
Non, pas de tableaux et déplacer le Var autour de rien ne vous aide. C'est une application assez grande et très stable qui fonctionne bien jusqu'à ce que j'ajoute ce petit extrait.
@Loren - merci oui tu as raison. J'ai aidé un collègue à résoudre ce qui semblait être exactement la même chose la semaine dernière, mais maintenant que je pense à cela, le tableau écrasait un pointeur, pas un var. Il est intéressant de noter que c'était cool car le tableau a été déclaré sous le pointeur, mais il "a sousfliné" en utilisant l'élément [0] lorsque le tableau a été déclaré [1..5]. Oups!
Je ne pense pas que votre erreur signifie quelque chose comme ce qu'il semble. Lorsque vous recevez une violation d'accès d'un morceau de code comme celui-ci qui n'a pas de moyen sain de produire une violation d'accès, vous regardez la mémoire détruite de la manière. P>
Trouvez le code fautif dans la fenêtre du processeur et voyez ce qui se passe vraiment. P>
Point équitable. Le peigne fine dentée est toujours un dernier recours, j'espérais avoir fait quelque chose de manifestation manifeste qui aurait peut-être été apparent. Je vais lui donner une allée et si rien d'autre, je suppose que je vais simplement construire une nouvelle unité plutôt que d'ajouter une ancienne. Je ne peux pas dire que je suis impatient de passer plus de temps que je n'ai pas perdu déjà la traçabilité des registres de la CPU résolvant un problème helloworld.
Une autre option: définissez un point d'arrêt dans lequel la variable est calculée à l'origine. Vérifiez que le numéro correct est en cours de stockage, puis définissez un point d'arrêt modifié de la mémoire sur le pointeur. (Méfiez-vous que ceux-ci ont été allés dans le système d'exploitation lui-même. Cela peut être assez moche.)
Vous utilisez avec des déclarations et cherchez un myCounter différent? P>
Une partie de votre code écrit en mémoire qu'il ne devrait pas ou libérer pendant que cela ne devrait pas et que, par accident, il entraîne des AV lorsqu'il accède à cette variable locale spécifique? P>
Hilarant - Certaines personnes sont si rapides à blâmer "avec" qu'ils l'accusent même de causer des problèmes de code qui ne l'implouent même pas. Bien que nous devions faire attention ... peut-être une déclaration de goto est responsable dans ce cas. ;)
@Deltics - en tant que OP ne montre pas tout, bien que extrait, cela est aussi bon de deviner comme autre chose.
@Lieven: Tout simplement pas vrai. Cette hypothèse n'était pas aussi bonne que les suppositions 100% précises (étant donné que celle-ci était 0% précise). :)
@Deltics - Bien, vous avez le dernier mot. :)
L'affectation myCounter: = 0 Lancer une violation d'accès suggère que le segment de données que les Vares globaux sont stockés a été retiré de la mémoire ou que les registres sont atteints dans votre routine MyProcédRure. p>
Utilisez la vue CPU pour voir les registres utilisés pour accéder au Var global, puis travailler à partir de là pour voir où / ces registres vont mal. P>
Êtes-vous sûr que c'est la ligne réelle qui déclenche l'exception? Avez-vous mis un point d'arrêt sur cette ligne? Avez-vous essayé de déplacer cette ligne en haut de la procédure? P>
Il est difficile d'être sûr sans votre code actuel devant moi, mais si je devais deviner, je dirais que la ligne avant em> ceci cause l'exception, puis le pointeur d'instructions a déjà incrémenté si Delphi met en évidence la ligne suivante. P> Lire l'adresse 00000008 CODE> signifie que vous lisez une variable à un décalage de 8 octets d'un pointeur
Bon point. Les exceptions matérielles se produisent souvent une fois que le point d'instruction est passé à la prochaine instruction / déclaration. Regardez dans le miroir de vue arrière pour voir ce que vous avez couru. ;>
Je viens de découvrir cela après avoir fait une trace du processeur, mais vous avez raison - j'étais en train de nettoyer (avec la méthode XX.Clear) une composante TiremailAddress (composant indy) qui causait les problèmes. Jongler des choses autour et l'accès plus tard a également lancé des exceptions. ** EDIT - En fait, c'était la boîtebox qui était effacée. Juste le même, problème résolu. Merci à tous pour de bonnes idées. La calvitie prématurée devra attendre un autre jour. À votre santé.
Pouvez-vous donner le texte exact du message d'erreur de violation d'accès, y compris les adresses? Cela pourrait être significatif.
----------------------------- Notification d'exception de débogueur ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- Projet .E> CLASSE EXCEPTION ESCELCE EACCESSVIOLATION avec message 'Violation d'accès à l'adresse 0043FDE8 dans le module' i> B> .exe '. Lire l'adresse 00000008 '. ----------------------------- Break Continuer l'aide ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------