42 votes

Pause quand une variable est assignée à une valeur

Je veux que jdb (que j'utilise via le débogueur Eclipse) soit brisé lorsqu'une valeur est affectée à une variable. Je ne suis pas intéressé par la définition d'un point d'arrêt sur une ligne spécifique mais plutôt plus généralement.

Par exemple, cassez chaque fois x == null.

Une telle chose est-elle réalisable?

41voto

Dinuk Points 594

Oui - Ce que vous avez besoin pour l'installation est un 'point d'arrêt Conditionnel' - ce qui vous donne la possibilité d'arrêter l'exécution du programme et l'étape à travers le débogueur lorsqu'un certain état de l'application est atteint.

Donc, disons que vous voulez sauter dans un point particulier de l'exécution lorsqu'une certaine condition est remplie (comme dans l'image ci-jointe), vous pouvez le faire comme suit:

  1. Ouvrez votre débogueur point de vue et sélectionnez les 'points d'arrêt' onglet

  2. Ajouter un nouveau point d'arrêt dans le fichier de code - à l'endroit où vous souhaitez observer l'exécution du programme

  3. Puis revenir à la 'points d'arrêt' de l'onglet, cliquez-droit sur l'entrée nouvellement ajoutée, et sélectionnez 'Propriétés des points d'arrêt'

  4. Définir la condition sur laquelle il doit être activé

alt text

10voto

Old Pro Points 7826

Vous pouvez vous rapprocher des points de contrôle de modification de champs . Elles se limitent à être placées sur des champs d’objets (et non à des variables locales, des paramètres ou des expressions) et sont déclenchées chaque fois que le champ est écrit, mais c’est l’Eclipse le plus proche de ce que vous voulez.

9voto

Brian Points 7975

Je vais commencer par la dernière réponse à votre question si vous n'avez pas à lire les détails si vous ne souhaitez pas. Fondamentalement, c'est possible, mais avec beaucoup de questions qui doivent être répondu en premier. Si vous voulez sauter et aller directement à la billetterie, vous pouvez y aller, mais je vous recommande de lire sur.

Eclipse utilise JDI (tout en bas de cette page) pour enregistrer les points d'observation avec la JVM. Ceci est fait grâce à l' EventRequestManager méthodes (la mise en œuvre est assurée par la JVM elle-même, pas Eclipse) qui créent des points d'observation, c'est à dire EventRequstManager.createModificationWatchpointRequest. La seule chose que ces méthodes accepter, c'est un Field (à noter que ce n'est pas le réfléchissants Field de la classe). Donc, en bref, Eclipse ne peut pas le faire directement via Java. N'ayez pas peur, Java ne gère pas les points d'arrêt conditionnels soit. Ceux-ci sont également mis en œuvre par le biais de l'Éclipse directement au lieu de s'appuyer sur l'île de Java. Il ya, cependant, certaines mises en garde qui conditionner les points d'observation beaucoup plus difficile à mettre en œuvre que des points d'arrêt conditionnel.

Considérons la plaine de points d'arrêt conditionnels. Dans l'ordre pour eux de travailler, vous avez besoin d'un contexte dans lequel vous pouvez exécuter l'extrait de code. Sans un contexte d'exécution pour le code, nous ne pouvons pas évaluer l'expression/états dans l'extrait de code puisque nous n'avons aucun moyen de résoudre les variables, les valeurs, les types, etc. Cela se fait à l'aide d'un AST analyseur qui traite le code Java dans les instructions. N'oubliez pas que vous pouvez taper un certain nombre de déclarations dans un état, pas une seule expression. L'évaluateur utilise ensuite un contexte (en particulier, une IJavaStackFrame) pour évaluer l'expression de lui-même après l'analyser.

Maintenant, pensez à conditionnelle d'un point d'observation, parce que ce dernier point est très important. Ce qui est un point d'observation du contexte d'exécution? La Variable d'accès peut se produire non seulement au sein de la même classe, mais également dans d'autres classes (pensez - protected et le paquet de membres), et dans les classes internes ainsi (via MyClass.this.myField). Cela signifie que:

  1. les variables locales ne sont jamais les mêmes depuis le champ peut être consulté à partir de plusieurs méthodes,
  2. les variables membres de la classe à partir de laquelle l'accès est invoquée ne sont jamais les mêmes depuis le champ peut être consulté à partir de plusieurs classes,
  3. les classes importées qui sont disponibles dans le contexte d'exécution ne sont jamais compatibles pour la même raison que (2), et
  4. l'accès du terrain en lui-même n'est jamais uniforme, car il peut exiger de qualification avec un exemple, nom de la classe, super ou quelque chose comme MyClass.this.myField (à l'intérieur de la classe d'accès).

La faisabilité d'une telle fonctionnalité est plutôt limité. Vous auriez du mal à réellement évaluer une non-évolution instruction conditionnelle pour un point d'observation depuis absolument rien dans le contexte d'exécution va être cohérente. Cela signifie que le code ne peut pas être facilement analysé et interprété sans signification particulière appliquée à des morceaux de code, tels que:

myField est toujours la même que this.myField ou super.myField ou MyClass.myField ou MyClass.this.myField, selon l'endroit où le champ est en cours d'accès.

Cela complique les choses un peu, surtout dans un système qui est déjà relativement complexe. Un exemple de point d'arrêt conditionnel code peut être trouvé ici (recherche d' getEvaluationEngine à l'aide de Ctrl+F). Maintenant, prenez cela et ajouter dans le pré-traitement sur l'expression basée sur un ensemble de règles sur l'endroit où nous sommes et où le terrain est, et de faire les choses peuvent se compliquer.

Autant que je sache, vous ne pouvez pas faire quelque chose comme, "si l'ancienne et de la nouvelle valeur est présente, suspendre", parce que l'information n'est tout simplement pas disponible à partir de l'information que vous pouvez obtenir dans le cadre de la pile (et donc à partir du débogueur). L'expression étant attribuée à la valeur a été évaluée par le temps, le point d'observation est touché, mais son résultat n'est pas disponible pour le débogueur, il n'est donc pas à la disposition de l'évaluateur sur le site lui-même. Une étape devra être réalisée en premier lieu de la mission, alors l'expression devra être évaluée après l'étape. Ce serait horriblement sale, et honnêtement, plutôt hacky à l'.

Dans tous les cas, si vous voulez exprimer votre soutien à cette fonctionnalité, vous pouvez utiliser cette Éclipse billet. Cependant, il a été autour depuis 2005 (8 ans maintenant) et a limité le soutien de la communauté. TBH, je ne le vois pas aller très loin, surtout sans plus de précision des attentes derrière ce genre de demande de fonctionnalité et sans certaines des principales considérations de conception mettre derrière lui en premier.

5voto

DigitalRoss Points 80400

Oui, ces points sont appelés points de contrôle et ces derniers peuvent avoir des expressions de contrôle.

Pour ce faire, vous devez sélectionner une variable dans la vue Structure et cliquer dessus avec le bouton droit de la souris ou, dans la vue Variables, la contrôler / cliquer dessus.

Un menu contextuel aura le choix entre Ajouter une expression de surveillance et Modifier une expression de surveillance .

1voto

mki Points 460

Désolé, il n’ya aucun moyen de faire ce que vous voulez dans Eclipse. Ce dont vous avez besoin, c'est d'un point de contrôle avec l'expression conditionnelle d'un point d'arrêt. Cela n'existe pas dans Eclipse.

Votre problème est également spécifique au débogage d'une bibliothèque. Il existe probablement d'autres moyens de réaliser ce dont vous avez besoin. Recherchez sur le forum pour voir comment les développeurs le font.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X