web-dev-qa-db-fra.com

Delphi: pourquoi les points d'arrêt de temps en temps ne sont pas utilisables (ligne surlignée en vert sur l'IDE)?

De temps en temps, je perds des fonctionnalités de points d'arrêt dans Delphi.

Je pensais que c'était un problème avec Delphi 2009, mais maintenant, je l'ai aussi dans Delphi XE.

Dans Delphi 2009, en supprimant le fichier .dproj, j'ai à nouveau fait fonctionner les points d'arrêt.

Dans Delphi XE, je ne parviens pas à faire apparaître les breakopints. J'ai la mise à jour 1 avec tous les correctifs appliqués.

Quelqu'un a-t-il une solution?

29
LaBracca

J'ai trouvé un meilleur moyen.

Dans l'arborescence du gestionnaire de projet, cliquez avec le bouton droit de la souris sur le projet et choisissez "Nettoyer" dans le menu contextuel.

Les points d'arrêt réapparaissent comme par magie et c'est une méthode très rapide.

21
LaBracca

Les informations de débogage ne sont pas présentes dans le fichier.

Assurez-vous que vous utilisez la configuration Debug. (Project Manager arborescence, développez Build Configurations, assurez-vous que Debug est en gras. Si ce n'est pas le cas, cliquez avec le bouton droit de la souris sur Debug et choisissez Activate dans le menu contextuel.) Assurez-vous de faire ensuite un Build de votre projet, pas seulement un Compiler .

Si cela ne fonctionne toujours pas, allez à Project->Options dans le menu principal de l'EDI, cliquez sur Compiling sous Delphi Compiler et vérifiez la section Debugging dans la moitié droite de la fenêtre. Assurez-vous que Debug Information et Local Symbols sont tous les deux cochés. Si vous essayez de retrouver la source de la VCL, cochez également Use debug .dcus (vous voudrez désactiver cette option et créer une version complète de votre projet dès que vous aurez terminé, car cela devient agaçant lorsque vous déboguez. normalement). Encore une fois, vous voudrez construire et non compiler.

Si tout ce qui précède échoue, une autre possibilité est que l’unité de code que vous avez ouverte dans l’éditeur de code ne soit pas identique à celle vue par le compilateur. Assurez-vous de ne pas avoir plusieurs copies du fichier sur votre ordinateur à un emplacement que le compilateur pourrait trouver en premier. Si vous n'êtes pas sûr, supprimez les fichiers .dcu portant ce nom d'unité, puis générez votre projet et vérifiez si le fichier .dcu nouvellement créé se trouve à l'emplacement souhaité.

47
Ken White

Je pense que cela se produit lorsque vous avez créé une version, avec le débogage désactivé. Ensuite, vous revenez à la configuration de débogage et faites une compilation plutôt qu'une compilation. Les fichiers pour lesquels vous ne pouvez pas définir de points d'arrêt correspondent à ceux contenant des DCU générés par une compilation avec débogage désactivé.

Faire simplement une compilation pour régénérer tous les fichiers DCU fera de nouveau fonctionner vos points d'arrêt.

13
David Heffernan

J'ai eu le même problème avec XE4. C'est pourquoi j'ai trouvé cet article il y a quelques heures. Aucune des solutions ci-dessus n'a fonctionné pour moi. La solution correcte pour moi - jusqu'à présent - consistait à ajouter l'option "symboles de débogage à distance". Étrange parce que je n’utilise pas de débogage à distance. Quoi qu'il en soit, ça a l'air d'aller maintenant.

5
fpiette

Voici une raison de plus pour aligner mal le code par rapport aux marqueurs de point d'arrêt ("pilule" bleu/rouge dans la gouttière).

L'éditeur reconnaît trois fins de ligne différentes,

  • CRLF (paire retour de chariot - saut de ligne)
  • CR seulement
  • LF seulement

CRLFest la valeur par défaut dans l'éditeur.

Cependant, le compilateur ne semble pas considérer CR only comme une fin de ligne, seulement CRLFet LF only. Ainsi, si votre fichier source contient un ou plusieurs CR only, les "pilules bleues" seront décalées par rapport à la source.

Vous avez peut-être des fichiers source avec CR only EOL (fin de ligne), par ex. l'Internet. Je me souviens de MAC OS utilisé CR only comme EOL.

Pour vérifier les EOL dans votre fichier, vous pouvez activer l'affichage des EOL dans l'éditeur.

( Tools - Options - Editor options - Source options - Show line breaks).

Les symboles ont l’air bizarre (voir images ci-dessous), mais ne sont que C au dessus de L pour CRLF, C au dessus de R pour CR et L au dessus de F pour LF.

Les images suivantes montrent les EOLs normaux (CRLFname__) et les EOLS après avoir forcé CR only pour une ligne et LF only pour une autre ligne dans un éditeur hexadécimal. Comme indiqué ci-dessus, c'est le CR only qui compense les marqueurs de points d'arrêt du code source.

CRLF___ Normal EOL's:

enter image description here

Une ligne avec CR only et une autre avec LF only:

enter image description here

Correction
Pour réinitialiser tous les EOL à CRLFname__, décochez Preserve line ends dans Editor Options

( Tools - Options - Editor options),

faire un changement trivial, pour que le fichier soit marqué comme modifié, fermez le fichier, enregistrez les modifications dans XYZ.pas YESet rouvrir.
Toutes les fins de ligne sont maintenant CRLF. Reconstruit le projet et toutes les balles de point d'arrêt seront aux bons emplacements.

4
Tom Brunberg

L'activation de symboles de débogage à distance l'a fait pour moi (rien d'autre n'a fonctionné). Projet> Options> Liaison et cochez la case Inclure les symboles de débogage distant.

2
user3673052

J'ai eu un problème connexe: j'ai perdu les points d'arrêt dans un fichier particulier, mais les autres fichiers étaient corrects. Ce qui s’est passé, c’est que j’ai renommé ce fichier, mais je n’ignore pas que la DCU de l’ancien fichier était toujours utilisée car elle était référencée quelque part dans une clause "uses". 

La solution consiste à supprimer manuellement tous les DCU (un "nettoyage" n'est pas suffisant, car l'ancien fichier représenté par la DCU ne figure plus dans le projet) et à reconstruire. Vous obtiendrez une erreur de compilation indiquant les mauvaises clauses "utilise".

2
dan-gph

Une autre raison pour laquelle le point d'arrêt ne fonctionne pas peut être (souvent testé avec delphi5):
Trop de procédures dans une unité.
La solution est de déplacer les procédures dans une autre unité

2
Werner

Essayez de déboguer à distance sur votre PC local.

Pourquoi ça marche: ( source )

Lorsque vous déboguez des projets Delphi localement, RAD Studio n'utilise pas votre fichier de débogage RSM car le compilateur contient les tables de symboles en mémoire. Toutefois, lorsque vous déboguez des projets Delphi à distance, vous devez générer un fichier de débogage RSM contenant ces tables de symboles. sinon, RAD Studio ne s'arrête pas à vos points d'arrêt.

Bien sûr, vous devez d’abord configurer l’option "Liaison" de votre projet "Fichier de mappage" sur "Détaillé" pour générer le fichier * .rsm. Voir Présentation du débogage distant pour savoir comment commencer.

1

Dans Delphi 7, il semble exister un véritable problème pour la définition des points d'arrêt.

J'ai eu une unité où de nombreux textes sont définis dans un 

const nom de const: tableau [0..x] de type d'enregistrement = (...);

dans la section interface, où type d'enregistrement a quelques éléments AnsiString . Dans la section implémentation, il y a quelques procédures.

Dans certains cas particuliers, lorsque je mets un point d'arrêt n'importe où dans une procédure, Delphi ne s'arrête pas là!

Remarques: toutes les options de débogage sont définies correctement (car F7 arrête Delphi au début du programme, des points bleus sont visibles dans toute l'unité, la ligne reste rouge lors de l'exécution de l'application) et toutes les DCU contenant des fichiers PAS correspondants. ont été supprimés de tous mes disques et de tous les dossiers avant que je ne construise complètement le projet. Donc, aucun fichier wold ne devrait traîner nulle part ..__ Pour tester, j'ai renommé le PAS en un autre nom, jamais utilisé auparavant, et sûrement nulle part ailleurs sur aucun disque, puis adapté toutes les sources et recompilé, juste pour être sûr que Je regarde le même fichier PAS - mais les points d'arrêt ne fonctionnent pas non plus.

Mais une autre chose très étrange s’est produite: le texte consts (!) A été modifié dans mon exécutable (pas dans le fichier exe, mais évidemment dans la mémoire)! L’exactitude de ces textes a été vérifiée au début du programme, et parfois il se plaignait d’erreurs! L'affichage des textes dans une boîte de message a montré qu'un caractère unique avait été modifié dans ce texte, définis comme const. Pour le test, j'ai essayé d'attribuer quelque chose à ce const dans mon code, mais, comme prévu, le compilateur s'est plaint, il ne peut donc s'agir d'une affectation ordinaire provoquant la modification du texte. Doit être un mauvais pointeur. Bizarre.

Ainsi, des heures d’essais ont suivi, recherchant tout code source susceptible d’avoir configuré un pointeur erroné qui pourrait ultérieurement provoquer cette modification dans un const text. J'ai placé la boîte de message dans la section d'initialisation de la première unité de la chaîne d'initialisation que j'ai pu modifier, mais le caractère modifié était déjà présent! Doit être changé très tôt au démarrage de mon application, alors!

Finalement, j'ai compris que le caractère qui apparaissait dans mes textes était toujours un $ CC - qui est exactement le code assembleur de INT 3, le code que Delphi utilise pour définir un point d'arrêt. Et lorsque vous déplacez une ligne vers le haut ou le bas d'un point d'arrêt dans cette unité, la position du personnage modifié déplace également certains caractères vers la gauche ou vers la droite! Et le nombre de caractères déplacés par le mauvais a été corrélé au nombre estimé d'octets codés par l'assembleur dont les lignes concernées avaient besoin. Si vous définissez deux points d'arrêt alignés les uns à côté des autres, deux caractères ont été modifiés! Lors de la suppression de tous les points d'arrêt de cette unité, le texte est resté inchangé!

Il n’ya donc qu’une conclusion à tirer: Delphi lui-même modifie ces textes en essayant de définir un point d’arrêt et ne le fait pas. Je suis incapable de me débarrasser de ce bug. Aucun des conseils concernant la resynchronisation de la comptabilité interne de Delphi des fichiers de code source et objet ne m'a pas aidé!

Étant donné que l’unité concernée était principalement composée de {$ I} lignes entre plusieurs {$ IFDEF}, afin d’inclure des textes Pascal différents mais longs, j’ai considéré que Delphi rencontrait des problèmes pour des inclusions trop longues ou pour l’évaluation de directives de compilation conditionnelles. J'ai donc supprimé les inclus et placé le texte source immédiatement dans l'unité, ainsi que les {$ IFDEF} s - qui ont été compilés sans erreur, mais la définition de points d'arrêt a également modifié les constantes de texte au lieu d'arrêter l'exécution. Tous les mêmes!

Pour l'instant, j'ai résolu ce problème en scindant l'unité en deux unités, l'une contenant uniquement les constants textuels de la partie interface, et l'autre, contenant les procédures. Et maintenant, sans changer aucun paramètre du compilateur ni de l'éditeur de liens, tous les points d'arrêt fonctionnent comme prévu et le texte n'est plus modifié!

Ainsi, si les points d'arrêt ne fonctionnent pas pour vous, même si vous êtes sûr qu'ils le devraient, il est possible que Delphes soit le coupable et ne puisse pas définir les points d'arrêt au bon endroit. Dans le cas où cela change seulement quelques textes, peut-être que cela n’attire jamais votre attention. Fractionner l'unité m'a aidé, peut-être que cela vous aide aussi.

1
chris

J'étais également confronté au même problème, alors je suis venu ici . En plus de la solution David Heffernan, j'ajoute une image ici . ça débogue, ça marche pour moi . S'il vous plaît jeter un oeil sur l'image .Make changes in Project Explorer

Merci Bon codage Iqbal

1
Iqbal

Si le groupe de projet utilise des packages (BPL), assurez-vous qu'aucun d'entre eux ne comporte d'avertissement du compilateur concernant les unités importées implicitement. Si ceux-ci existent, vous ne pourrez parcourir le code que via la fenêtre de débogage de la CPU.

0
SteveC

Dans mon cas, je définissais des points d'arrêt dans une unité qui, bien qu'ouverte dans IDE], ne faisait pas partie du projet actuellement actif. Ces points d'arrêt apparaissent également en vert. IOW je n'étais pas du tout sur la bonne page.

(J'ai découvert cela après avoir essayé tout ce qui précède.) 

0
hugha

ИспользуяF9чтобы запустить приложение, точки останова будут работать как положено. Использую XE4, и я не знаю, исправит ли то предыдущие версии Delphi.

0
user1045302

Si le fichier dans lequel vous essayez de définir des points d'arrêt fait partie d'une DLL, vous devez l'activer DLL en double-cliquant dessus dans le Gestionnaire de projets pour qu'il devienne gras, puis le générer. Ensuite, les cercles bleus apparaîtront à côté des lignes où vous êtes autorisé à définir des points d'arrêt.

0
Noumenon

Peu de retard, mais je suis tombé sur ce problème aussi.

Si j'ai activé MyPackage.bpl (gras) dans le gestionnaire de projet avec la configuration de débogage, puis compilé, je pouvais voir que IDE enregistrait les informations de débogage (points bleus à gauche de l'éditeur).

Mais lorsque j'ai activé mon MainProject.exe (celui qui utilise MyPackage.bpl), ces points bleus ont disparu, indiquant que les informations de débogage ne sont plus présentes. Après un peu de tête, j'ai réalisé que j'avais configuré une dépendance (clic droit sur MainProject.exe -> Dépendances) sur la configuration Release de MyPackage.bpl et non sur la configuration Debug. 

Chaque fois que je compilais MyProject.exe, il était lié à la configuration de la version, pas à la configuration de débogage!

Alors vérifiez vos configurations de dépendance!

0
Ludovic C

J'avais vérifié MSBuild sous Delphi Compile (nous faisons MS Builds). Cela empêchait les points d'arrêt de fonctionner. Décoché et ça marche.

0
Meta Mussel