IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Creator Discussion :

Utilisation du débogueur [Débuter]


Sujet :

Qt Creator

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut Utilisation du débogueur
    Bonjour à tous.

    Je viens vers vous pour tenter de comprendre comment débuger un programme sous Qt (et peut-être plus largement sous C++)

    Voici mon problème. En synthèse je souhaite pouvoir suivre le changement des valeurs que peuvent prendre les champs lorsque renseignés par l'utilisateur.

    Actuellement, je procède de la façon suivante :

    1) je mets un point d'arrêt dans le main.cpp à la première ligne interprétable.
    2) au lancement du débogage avec F5, les valeurs des variables et paramètres sont affichées en haut à droite.
    3) je poursuis le programme en pas à pas avec F10, F11... Les valeurs évoluent selon la progression du programme mais les fenêtre de mon application ne sont pas encore accessibles
    4) Après avoir passé l'exécution du programme avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return monapplication.exec()
    , ma fenêtre devient alors accessible, mais je n'ai plus accès aux variables car le debugger affiche que mon programme s'est terminé avec le code 0 et que le debogage est fini.

    Effectivement, je peux maintenant maniper dans ma fenêtre, renseigner des champs, changer des listes à points... sans avoir plus aucun accès aux valeurs que prennent mes variables.

    Donc, je pense être "à coté de la plaque" mais je n'ai pas trouvé comment faire autrement.

    Auriez-vous une alternative pour résoudre ce problème ?

    Par avance, merci.

  2. #2
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Le problème viens du fait que les points d'arrêt ne sont que dans la fonction main, il faut ajouter un point d'arrêt dans la méthode exec de monapplication (je suppose que c'est une classe dérivée ?)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Voici la fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <QApplication>
    #include "fenprincipale.h"
     
     
    int main(int argc, char *argv[])
    {
        QApplication generateurDeClasse(argc, argv);
        FenPrincipale mainWindows;
        return generateurDeClasse.exec();
    }
    Je mets le point d'arrêt en principe sur la ligne 8 : "FenPrincipale mainWindows;"

    Pour la methode exec, je ne pense pas y avoir accès, car c'est celle de Qapplication.

    Si je rentre dans cette méthode lors du debug, c'est du binaire que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    0x83c954                   55              push   %ebp
    0x83c955  <+0x0001>        89 e5           mov    %esp,%ebp
    0x83c957  <+0x0003>        83 ec 08        sub    $0x8,%esp
            2979 [1]	in kernel\qapplication.cpp
    0x83c95a  <+0x0006>        a1 0c 8e f5 00  mov    0xf58e0c,%eax
    0x83c95f  <+0x000b>        ff d0           call   *%eax
            2980 [1]	in kernel\qapplication.cpp
    0x83c961  <+0x000d>        c9              leave
    0x83c962  <+0x000e>        c3              ret
    0x83c963  <+0x000f>        90              nop

    (je suppose que c'est une classe dérivée ?)
    J'interprète classe dérivée par classe héritée (je débute ).
    Oui pour la classe FenPrincipale qui est une classe héritée de QWidget.

    Merci pour ton aide.

    PS : si je mets un point d'arrêt après l'instruction show() de la classe FenPrincipale, je n'ai pas accès à cette fenêtre bien qu'elle soit présente dans la barre des tâches de windows.

  4. #4
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Je n'ai pas fais de programmation Qt depuis un bon moment, si tu as des méthode que tu as réécrite dans FenPrincipale qui sont appelé à chaque images, tu peux y mettre des points d'arrêt.
    Après normalement, à tout point d'arrêt tu peux voir les différentes frames : exemple avec gdb (utilisation de la commande bt (backtrace))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #0  0x000000004794f49f in ?? () from /usr/local/lib/dri/i965_dri.so
    #1  0x0000000047950409 in ?? () from /usr/local/lib/dri/i965_dri.so
    #2  0x000000000047a54f in S3DE::Shader::GetUniformLocation (
        this=0x7fffffffd1c8, name=@0x7fffffffb048)
        at /usr/home/S3DE/src/engine/Shader.cpp:203
    #3  0x0000000000448250 in S3DE::Light::Init (this=0x7fffffffd1c8)
        at /usr/home/S3DE/src/engine/Light.cpp:109
    #4  0x00000000004362ee in S3DE::CEngine::Draw (this=0x7fffffffd118, 
        elapsed=29786)
        at /usr/home/S3DE/src/engine/Engine-main.cpp:141
    #5  0x000000000040bc3f in main (argc=1, argv=0x7fffffffe900)
        at /usr/home/demo-s3de/src/main.cpp:279
    et du coup si j'ai un point d'arrêt à ce moment, j'ai juste à changer de frame pour avoir les valeurs qui m’intéresse

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Merci monwarez pour ces explications.

    Malheureusement, je ne suis pas en mesure de transposer ce que tu présentes.

    Voici FenPrincipale :


    Et le détail de la classe est déjà décrit ici :
    http://www.developpez.net/forums/d15...l-application/

    En fait, comme précisé ci-dessus, mon intérêt réside dans la manipulation des champs. Si j'ai bien compris ton séquentiel d'images et la position du point d'arrêt de ton exemple, chez moi, où que je mette le point d'arrêt, je n'ai jamais le debug actif en même temps que l'affichage de la fenêtre...

    Aussi que puis-je faire/paramétrer pour obtenir ce résultat ?

  6. #6
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    As-tu essayé de mettre des points d'arrêt dans les fonctions qui gèrent les champs ? Je pense que le fait que Qt utilise plusieurs thread peut compliquer le débogage , en effet il faudrait mettre les points d'arrêt dans le bon thread, mon exemple venait d'un programme qui n'utilise pas de multi-thread.
    Une idée à essayer : remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return generateurDeClasse.exec();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int retour = generateurDeClasse.exec(); // placer le breakpoint ici
    return retour;
    Comme ça le breakpoint ne se fait pas après l’exécution de l'application.
    Voir debugging a Qt Quick example Application

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Merci monwarez.

    Cette réécriture du main est meilleure, même si je n'ai pas encore la main comme je le désire, mais ça répond déjà à un besoin.

    Pour le lien que tu m'as donné, j'étais déjà passé par ici, mais c'est une explication pour le QML et je n'en suis pas encore à ce niveau.

    Quant aux break dans les fonctions gérant les champs, j'avais essayé, mais ça ne le fait pas. L'arrêt se produit avant l'instruction show() et donc, pas d'accès à la fenêtre à ce moment.

    Encore merci.

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je ne suis pas certain de répondre au besoin, mais il est possible d'éditer les points d'arrêts, ou encore, de mettre un point d'arrêt (clic droit sur le point d'arrêt), qui s'arrêtera au changement de valeur d'une variable.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Merci Littlewhite.

    C'est aussi une très bonne solution. Ca me permet de maniper un peu ma fenêtre.

    Néanmoins, dès que la condition du point d'arrêt est atteinte, la fenêtre n'est plus accessible. Mais au moins je peux maintenant avoir accès aux valeurs.

    En revanche, je n'ai pas trouvé la condition "on change" (par exemple pour un champ de texte). La connaitrais-tu ?

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Oui, si le débogueur arrête le programme, la fenêtre n'est plus utilisable. Du coup, la solution sera plus sur un qDebug() et sur la capture du signal textChanged. C'est moins beau, mais cela sera plus flexible, je pense.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 199
    Points : 103
    Points
    103
    Par défaut
    Merci bien, c'est en effet plus souple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 17 créateurs de langages de programmation disent ne pas utiliser de débogueurs interactifs
    Par Idelways dans le forum Débats sur le développement - Le Best Of
    Réponses: 310
    Dernier message: 28/09/2016, 12h51
  2. Utilisation du débogueur PHP Xdebug
    Par Invité dans le forum Langage
    Réponses: 2
    Dernier message: 01/04/2011, 10h32
  3. Réponses: 0
    Dernier message: 21/01/2011, 14h11
  4. utiliser le débogueur JDT dans la programmation
    Par dorraBB dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 25/06/2008, 16h12
  5. Utilisation du débogueur MSE7
    Par albert045 dans le forum VBScript
    Réponses: 0
    Dernier message: 19/04/2008, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo