Appeler une fonction lors d'un breakpoint

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous.

Je travaille avec Netbeans 8.0 et je debug une application écrite en Java. Lorsque je tape un breakpoint, je veux pouvoir appeler une fonction sur un objet. Le but c'est de choper la valeur d'un BigInteger avec un appel à intValue au lieu de voir les différents champs qui composent la classe (et qui ne me parles absolument pas). Pas moyen de trouver comment faire.

Je pensais que c'était assez basique mais faut croire que non…

Je suis prêt à changer de debugger si jamais il le faut.

Merci. David.

Édité par Davidbrcz

+0 -0
Auteur du sujet

Prenons le code suivant

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class TestJava {
    int a;
    int b;

    public int foo(){
        return a+b;    
    }
    public TestJava(int aa,int bb){
        a=aa;
        b=bb;
    }

    public static void main(String[] args) {
        TestJava t = new TestJava(42,666);
        System.out.println("PIPO");
    }

}

Imagine que je colle un breakpoint sur la ligne de System.out.println. Comment je fais pour appeler t.foo depuis mon debguger quand j'ai atteint le breakpoint ?

+0 -0
Staff

Il te suffit de rajouter ton t.foo() dans ton code après le system.out.println et ton breakpoint positionné sur le system.out.println va, lors du debug, s'arrêter sur cette ligne, te donnant ainsi la possibilité de poursuivre manuellement l'exécution de ton code.

Tu pourra donc au fur et à mesure voir l'évolution des valeurs.

Auteur du sujet

Il te suffit de rajouter ton t.foo() dans ton code après le system.out.println et ton breakpoint positionné sur le system.out.println va, lors du debug, s'arrêter sur cette ligne, te donnant ainsi la possibilité de poursuivre manuellement l'exécution de ton code.

En suivant ta logique, si je veux voir la valeur avant/après une intruction, je dois ajouter 2 appels ? C'est pas pratique du tout…

Et puis changer le code pour debuguer c'est vachement con. Cat tu vas pas debug pas le même code (par définition) et ca sape tout le principe du debugger.

Tu pourra donc au fur et à mesure voir l'évolution des valeurs.

Le truc c'est que je me contre fiche des valeurs des champs, elles ne me parlent pas. Le seul truc qui me parle, c'est le résultat d'un appel de fonction, fonction je ne n'ai pas les sources et que je ne peux pas appeler quand je debug …

Édité par Davidbrcz

+0 -0

Dans le debugger d'Eclipse, le toString de l'objet est automatiquement affiché dans la vue "Variables" (Voir mon screen ci-dessous).

Vue variable d'Eclipse

Je pense que ça répond à ton besoin du coup.

Sinon, le debugger d'Eclipse permet le remplacement du code à chaud (sans redémarrer la JVM) et donc d'ajouter du code à exécuter (mais ça ne marche pas tout le temps).

+0 -0
Staff

Le truc c'est que je me contre fiche des valeurs des champs, elles ne me parlent pas. Le seul truc qui me parle, c'est le résultat d'un appel de fonction, fonction je ne n'ai pas les sources et que je ne peux pas appeler quand je debug …

Davidbrcz

Si tu veux injecter n'importe quoi comme code (qui n'existait pas avant) au bon milieu d'un breakpoint, je crois que netbeans n'est pas fait pour ça.

Auteur du sujet

Dans le debugger d'Eclipse, le toString de l'objet est automatiquement affiché dans la vue "Variables" (Voir mon screen ci-dessous).

Vue variable d'Eclipse

Je pense que ça répond à ton besoin du coup.

Sinon, le debugger d'Eclipse permet le remplacement du code à chaud (sans redémarrer la JVM) et donc d'ajouter du code à exécuter (mais ça ne marche pas tout le temps).

AlexRNL

Effectivement, y'a une colonne pour avoir la valeur de toString, elle n'était pas activée =/. Mais si je veux autre chose, je peux pas (genre un nombre en binaire/hexa/octal).

Si tu veux injecter n'importe quoi comme code (qui n'existait pas avant) au bon milieu d'un >breakpoint, je crois que netbeans n'est pas fait pour ça.

Je suis prêt à changer d'outils pour pouvoir faire ce que je veux avec mon programme

Édité par Davidbrcz

+0 -0

Les deux "grands" IDE Java permettent de faire ça à ma connaissance.

Dans Eclipse en mode debug, affiche la vue "Expression" et tu peux appeler n'importe quoi (une méthode ou autre). (Window -> Show view -> Expressions)

Dans IntelliJ c'est possible aussi : https://www.jetbrains.com/idea/help/evaluating-expressions.html

(Note : la doc d'IntelliJ est nettement meilleure que celle d'Eclipse, par contre les mecs de chez JetBrains sont complètement cinglés pour pondre une UX pareille : c'est simple : la fonctionnalité n'est jamais où tu la cherches… Heureusement que la doc est bonne).

Je pensais que c'était assez basique mais faut croire que non…

Si si, clairement c'est basique et encore heureux que les IDE civilisés proposent ça.

Par contre ce qui n'est pas basique, c'est dompter un IDE Java en disons… Moins de 6 mois. Et pour le coup y'en a aucun qui soit à la fois complet et facile d'accès…

Happiness is a warm puppy

+1 -0

Cette réponse a aidé l'auteur du sujet

Avec ton exemple sous Netbeans, tu pose ton breakpoint sur System.out.println(…), puis tu lance le debugger Netbeans ctrl+F5

Il faut afficher la fenêtre "Evaluate Expression" ctrl+F9 ou le menu "Debug" et "Evaluate Expression…"

saisir dans cette fenêtre "t.foo();" et tu lance l’évaluation avec la flèche verte d’exécution qui se trouve dans cette fenêtre. Tu récupère la valeur de ton expression dans la la fenêtre des variables.

Le tout en image : Le tout en image

+2 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte