8
votes

Je reçois une "variable x inaccessible ici en raison de l'optimisation"

Je reçois des 'variables forilluusers inaccessibles ici en raison de l'optimisation "même si la configuration de construction est définie sur" débogage "et l'optimisation est fausse. Donc, je ne peux pas déboguer mon programme.

Pourquoi est-ce que je reçois ça?
Quelle construction est couru quand j'appuie sur le bouton d'exécution?
Comment puis-je voir


xxx

... fin;


mise à jour:

Seulement minutes depuis que j'ai posté cette question et que cela a déjà été voté deux fois sur deux fois. Semble que c'est un problème assez courant.


10 commentaires

Montrez le code que vous obtenez le problème et je vais vous aider.


C'est normal (et un peu ennuyeux). Vous devez simplement vérifier les variables à une autre heure (et non dans un extrémité 'déclaration', par exemple).


Salut andreas. Je connais ce problème de D7. C'était ennuyeux mais pas beaucoup. Mais ce n'est pas ça. Je suis au milieu de ma procédure.


Je dirais que c'est un tel type de l'optimisation intégrée du débogueur. Je sais seulement que vous essayez de regarder le dernier (ou le seul) de votre variable locale quel débogueur prend aussi optimisé pour que vous ne puissiez pas obtenir la valeur de celle-ci. Je ne connais que la solution de contournement - j'utilise cette variable à nouveau et l'attrape avant la dernière utilisation de la méthode.


@Altar - Vous serez peut-être au milieu mais c'est la dernière fois que vous utilisez cette variable dans votre procédure. Ça me rend fou aussi.


@Daemon_x - mais mon compilateur n'est pas défini pour optimiser le code. Optimisation si faux. Dans d7 false signifiait false = ne pas optimiser / altérer le code.


@Altar - je sais; Cela me cherche comme un problème de longue date parce que j'ai D2009 et cela fait de même (y compris l'optimisation = Faux).


@Altar, je ne suis pas sûr que ce soit un bug. Quel code de montage est-il généré par Delphi pour cette routine avec optimisation?


@ALTAR Tous les logiciels ont des bogues et chaque fois que vous passez à une nouvelle version, il faut du temps pour devenir acclimatisé. Pour que je puisse avoir été heureux avec mon déménagement de D6 à D2010, qui comprenait un port relativement simple d'environ 1 million de LOC.


@David - Yah ... Je pense avoir juste besoin d'un moment pour vous habituer à cette nouvelle version. Après avoir travaillé avec D7 depuis quelques années, je dois mieux le savoir et se mettre habituellement habitué aux problèmes qu'elle avait.


3 Réponses :


11
votes

Nous en souffrons tous de temps en temps. Ce que je fais parfois, c'est ajouter un certain code parasite au point où j'ai besoin de déboguer la variable qui fait référence à la variable mais ne fait rien. Par exemple: xxx

ou s'il s'agit d'une booléenne, alors: xxx

quelque chose sur ces lignes est généralement suffisante pour que le compilateur écrit Code de sortie qui maintient la variable vivante afin que le débogueur puisse l'inspecter. Assurez-vous de mettre le code dès le bas de la routine! Et assurez-vous de vous rappeler de le supprimer avant de vérifier le code dans.


6 commentaires

+1 pour le si b alors b: = pas pas b; :) et bien sûr que vous avez raison. Quoi qu'il en soit, il suffit de lire la valeur; Vous n'avez pas besoin d'assigner cela.


Salut David. Cela vous arrive jamais à vous sous Delphi 7? Je ne l'ai pas vu jusqu'à maintenant (à moins que le point d'exécution n'était effectivement à la fin de la routine)


@daemon_x Je ne peux jamais être sûr à quel point vous devez faire pour persuader le compilateur de se comporter comme je le désirais. J'ai tendance à se tromper du bon côté!


@Altar Je n'ai jamais utilisé Delphi 7. Je suis allé droit de 6 à 2010.


@David, belle solution de contournement mais je ne crois pas que ce soit la réponse, et je ne crois pas que XE a ce bogue. Delphi 2010 n'affiche pas.


@Johan j'ai posté ceci avant qu'il y ait eu de code. C'est un peu difficile de savoir exactement ce qui se passe depuis que nous ne connaissons pas les paramètres de compilateur précis que l'autel utilise.



9
votes

Voyons la différence avec et sans optimisation dans le code: xxx pré>

voici le code de montage avec fort> Optimisation: P>

{$Optimization on/off}  or
{$O+/-}


4 commentaires

Salut Johan. C'est ce que je fais !!! J'ai déjà défini l'optimisation sur "Options de projet". Je ne vois pas le point de la définir une fois de plus pour désactiver le fichier Pas. Surtout que ce sera un vrai zoo lorsque je veux passer de débogage à la construction de débogage. J'oublierais probablement de supprimer la directive {$ o-}. Mais je suis sûr que c'est juste un bug Delphi Xe. Dans l'ensemble, ils ont seulement publié la mise à jour 1 pour Delphi Xe. Droit. Nous devrons attendre la mise à jour 2, 3, 4, 5 ... et peut-être même 6.


Je dis simplement que vous auriez peut-être laissé un {$ o +} quelque part. Vous pouvez également vous casser sur le point avant Votre VaR sort hors de portée et cliquez avec le bouton droit de la souris pour un menu, choisissez Débogou-> Afficher la CPU . Copier coller la partie pertinente dans la question.


"Je dis simplement que tu aurais peut-être laissé un {$ o +} dans quelque part" - c'était mon point: je n'utilise pas cette directive compilateur juste parce que je pourrais l'oublier. C'est ma règle. Je ferai une recherche de la recherche mais ce sera inutile depuis que je n'ai jamais cassé cette règle.


@Altar, 1. Que génère le code de montage que Delphi. 2. Essayez de mettre {$ ifdef débog} {$ o-} {$ endif} , quel code génère-t-il maintenant? 3. Même chose que (2) sans le {$ IFDEF}.



2
votes

Le code que vous avez posté ne compile pas comme - est , donc je ne peux pas être à 100% que je n'ai pas tué le cas de reproduction par mes modifications personnelles pour le faire courir ... Mais je ne peux pas reproduire votre problème particulier . Quelqu'un d'autre qui peut?

Bien sûr, le débogueur / évaluateur se plaint lors de l'optimisation, mais le problème disparaît définitivement avec l'optimisation et une reconstruction. Êtes-vous sûr de faire une reconstruction appropriée?

Je suis un peu en désaccord avec la déclaration de Davids selon laquelle "nous en souffrons tous de temps en temps". Outre des cas frontaliers connus et prévisibles (variables étant hors de portée avec le point d'arrêt à la fin), je jamais rencontre ce problème. Tant que j'empêche mes collègues de vérifier la DPROJ en version de version avec optimisation, c'est-à-dire.


2 commentaires

Vous pourriez avoir raison, peut-être que c'est moi qui fait quelque chose de mal. Je n'ai jamais vraiment essayé de mal comprendre ce que c'est exactement qui me fait utiliser des tours comme je l'ai décrit dans ma réponse. Je suis généralement plus intéressé par la résolution du problème à portée de main que de regarder sous le capot.


@David qui est probablement une attitude beaucoup plus saine que de tirer parti de tous les problèmes de productivité mineurs comme moi ... là encore, nos juniors ont tendance à Demander à propos de ces choses quand ils les rencontrent d'abord et je déteste avoir à leur répondre "ignorer et violer jusqu'à ce qu'il fonctionne". Sauf si il y a un crunch, c'est-à-dire. :)