Delphi violation d'accès affectation de variable locale
Cela semble être la chose la plus simple au monde, et je suis prêt à tirer mes cheveux sur elle.
J'ai un appareil qui ressemble à ceci ;
Unit myUnit;
// ...
//normal declarations
//...
Public
//bunch of procedures including
Procedure myProcedure;
const
//bunch of constants
var
//bunch of vars including
myCounter:integer;
Implementation
Uses //(all my uses)
// All of my procedures including
Procedure myProcedure;
try
// load items from file to TListBox - this all works
except
on EReadError do begin
// handle exception
end;
end; //try
myCounter:=0; // <-- ACCESS VIOLATION HERE
while myCounter //...etc
C'est une simple affectation d'une variable et je n'ai aucune idée de pourquoi il le fait. J'ai essayé de déclarer la variable locale à l'unité, à la procédure, à l'échelle mondiale, où j'essaie de le faire je ne peux pas attribuer une valeur de zéro à un nombre entier, a déclaré n'importe où, dans cette procédure, sans qu'il en jetant une violation d'accès. Je suis totalement perplexe.
Je vais appeler la procédure à partir de l'intérieur d'un bouton OnClick gestionnaire de la même unité, mais peu importe où je l'appelle depuis qu'il lève l'exception. Le plus fou c'est que je fais exactement la même chose dans une douzaine d'autres endroits dans les unités de tous les coins du programme sans problèmes. Pourquoi ici? Je suis à une perte totale.
--------------------------- Débogueur Notification d'Exception --------------------------- le Projet .exe ont soulevé l'exception de la classe EAccessViolation avec message d'erreur " violation d'Accès à l'adresse 0043FDE8 dans le module '.exe'. Lecture de l'adresse 00000008'. --------------------------- Saut De Continuer À Aider ---------------------------
OriginalL'auteur J... | 2010-04-27
Vous devez vous connecter pour publier un commentaire.
Read of address 00000008
signifie que vous êtes en train de lire une variable à un décalage de 8 octets à partir d'un néant pointeur. Cela ne correspond pas à ce que vous essayez de faire ici, puisque vous écrivez, pas de lecture, et vous êtes en train de rédiger une constante, pas une variable de lecture à partir de quelque part.Êtes-vous sûr que c'est la ligne de déclenchement de l'exception? Avez-vous mis un point d'arrêt sur cette ligne? Avez-vous essayé de déplacer cette ligne vers le haut de la procédure?
Il est difficile d'être certain que sans votre code en face de moi, mais si je devais deviner, je dirais que la ligne avant c'est à l'origine de l'exception, et puis le pointeur d'instruction a déjà incrémenté afin de Delphi met en évidence la ligne suivante.
J'avais découvert cela après avoir fait un CPU de trace, mais vous avez raison, j'ai été de compensation (avec xx.Méthode claire) un TIdEmailAddressList (Indy composant) qui a été à l'origine des problèmes. Jongler avec les choses autour et y accéder plus tard aussi était de lever des exceptions. **edit - en fait, il était la TListBox qui a été dégagée. Tout de même, le problème est résolu. Merci à tous pour les bonnes idées. La calvitie prématurée faudra attendre un autre jour. Des acclamations.
OriginalL'auteur Mason Wheeler
Je ne pense pas que votre erreur signifie quelque chose comme ce qu'il paraît. Lorsque vous obtenez une violation d'accès à partir d'un morceau de code comme celui-ci qui n'a pas de sane façon de produire une violation d'accès vous êtes à la recherche à la corbeille de la mémoire d'une certaine façon.
Étape à travers le code fautif dans l'unité centrale de la fenêtre et de voir ce qui se passe réellement.
Une autre option: Définir un point d'arrêt où la variable est initialement calculé. Vérifiez que le numéro correct est stockée, puis de définir un mémoire modifié à point d'arrêt sur le pointeur. (Méfiez-vous que j'ai eu dans l'OS lui-même. Il peut être assez laid.)
OriginalL'auteur Loren Pechtel
Vous utilisez avec les déclarations et sont à la recherche à un autre myCounter?
Une partie de votre code est écrit dans la mémoire, il ne devrait pas libérer alors qu'il ne devrait pas et que par hasard il en résulte AV lors de l'accès à cette variable locale spécifique?
Que l'OP ne montre pas tout, bien que tiré par les cheveux, c'est aussi bon d'une supposition comme une autre.
Tout simplement pas vrai. Cette supposition n'était pas aussi bon que les suppositions qui ont été précis à 100% (étant donné que celui-ci était de 0% de précision). 🙂
très bien, vous avez le dernier mot. 🙂
OriginalL'auteur Lars Truijens
La cession myCounter := 0 lancer une violation d'accès suggère que soit le segment de données que le mondial de revendeurs à valeur ajoutée sont stockées dans a été supprimée de la mémoire, ou que les registres sont arrosé dans votre maprocédure routine.
Utiliser le CPU pour voir quels registres sont utilisés pour accéder au global var, et ensuite travailler vers l'arrière à partir de là, pour voir où ces registres vont de travers.
OriginalL'auteur dthorpe
Déplacer MyCounter jusqu'au sommet de la var de la liste, et de voir si il arrive encore. Si le problème disparaît, regardez les vars déclarées ci-dessus où vous l'avez maintenant, vous trouverez peut - être quelque chose d'intéressant, comme un tableau qui est en croissance-delà de ses limites.
Non, pas de tableaux, et en déplaçant le var autour de n'aide pas. Il est plutôt grand et très stable de l'application qui fonctionne très bien jusqu'à ce que j'ajoute dans ce petit extrait.
merci, oui, vous avez raison. J'ai aidé un co-travailleur de résoudre ce qui semble être exactement la même chose la semaine dernière, mais maintenant que j'y pense, le tableau était d'écraser un pointeur, pas un simple var. Il est intéressant de noter, c'était cool, parce que le tableau a été déclaré sous le pointeur, mais il "underflowed" en utilisant l'élément [0] lorsque le tableau a été déclaré [1..5]. oups!
OriginalL'auteur Chris Thornton