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 Discussion :

QDebug plante avec CuteTest


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut QDebug plante avec CuteTest
    Bonjour,
    J'utilise CuteTest dans mon projet qui est une surcouche du module de test unitaire Qt. Lorsque je veux appeler qDebug() dans le code du test ou bien dans mon code, ça plante. J'ai lu que qDebug() est lié à QApplication, mais comme cette partie là est gérée par la lib CuteTest je ne vois pas trop comment arranger les choses.

    En gros le main de test appelle cette fonction de la lib :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      int TestConsoleFrontend::main(int argc, char *argv[]) {
        QCoreApplication app(argc, argv);
     
        if (TestRunner::execInnerProc()) {
          return 0;
        }
     
        TestRunner runner;
        TestConsoleFrontend frontend(&runner);
     
        // NOTE: Results are printed asynchronously (because the tests run in a child process due to limitations in QTest).
        runner.runAllTests();
     
        return app.exec();
      }
    Je suppose que le plantage vient du fait que le code contenant mes QDebug est appelé au niveau de runAllTests() donc quand app.exec() n'a pas encore été appelé.

    Est-ce qu'il y a un moyen d'utiliser QDebug() autrement sans qu'il repose sur QApplication ? std::cerr fonctionne normalement, j'aurais juste besoin de QDebug pour afficher facilement les objets Qt (listes etc) pendant mes tests.

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Je doute que ce soit le app->exec() qui pose problème. Avez-vous essayé de mettre un qIntallMsgHandler() pour voir ce si ça plante toujours avec ? La lib CuteTest en a peut-être installé un qui ferait planter ? À voir au débogage.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Regarde si tu n'as pas le même problème que dans cette discussion avec le paramètre argc de ton constructeur (déclaré int au lieu de int&)

  4. #4
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    J'ai essayé de recompiler la lib avec int& mais ça ne change rien. De toute façon ça ne plante qu'avec un qDebug() dans le code. De plus l'appel au main de la lib se fait en une ligne, l'argument entier ne pourrait pas être modifié en dehors du corps de la fonction que j'ai copié au début.

    J'ai recherché un appel à qIntallMsgHandler() dans le code de la lib sans succès, pas de QtMsgType non plus.

    J'ai lancé mon test avec gdb, j'obtiens la pile suivante. C'est dans le code de CuteTest que ça plante, et à première vue je ne vois pas vraiment pourquoi, donc je pense que je vais laisser tomber et me passer de QDebug tant pis.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff7baa7a0 in CuteTest::TestCase::addIncident (this=0x7fffffffd350, incident=...) at ../src/TestCase.cpp:110
     
    (gdb) backtrace
    #0  0x00007ffff7baa7a0 in CuteTest::TestCase::addIncident (this=0x7fffffffd350, incident=...) at ../src/TestCase.cpp:110
    #1  0x00007ffff7ba9d86 in CuteTest::QTestXmlParser::parseIncident (this=0x7fffffffd580, elem=..., testCase=0x7fffffffd350) at ../src/QTestXmlParser.cpp:156
    #2  0x00007ffff7ba9409 in CuteTest::QTestXmlParser::parseTestCase (this=0x7fffffffd580, elem=...) at ../src/QTestXmlParser.cpp:96
    #3  0x00007ffff7ba9039 in CuteTest::QTestXmlParser::parse (this=0x7fffffffd580, xml=..., srcFile=..., buildDir=...) at ../src/QTestXmlParser.cpp:70
    #4  0x00007ffff7bba910 in CuteTest::TestRunner::onFoundEnvelopedXml (this=0x7fffffffdfc0, xml=..., fileName=..., buildDir=...) at ../src/TestRunner.cpp:140
    #5  0x00007ffff7bc400a in CuteTest::TestRunner::qt_metacall (this=0x7fffffffdfc0, _c=QMetaObject::InvokeMetaMethod, _id=6, _a=0x7fffffffd770) at debug/moc_TestRunner.cpp:91
    #6  0x00007ffff7864b27 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib/libQtCore.so.4
    #7  0x00007ffff7bc4969 in CuteTest::XmlEnvelopeParser::foundEnvelopedXml (this=0x614968, _t1=..., _t2=..., _t3=...) at debug/moc_XmlEnvelopeParser.cpp:86
    #8  0x00007ffff7bc3813 in CuteTest::XmlEnvelopeParser::parseContent (this=0x614968) at ../src/XmlEnvelopeParser.cpp:84
    #9  0x00007ffff7bc348b in CuteTest::XmlEnvelopeParser::append (this=0x614968, data=...) at ../src/XmlEnvelopeParser.cpp:38
    #10 0x00007ffff7bba7bd in CuteTest::TestRunner::onSubProcReadyReadStdout (this=0x7fffffffdfc0) at ../src/TestRunner.cpp:129
    #11 0x00007ffff7bc3fb3 in CuteTest::TestRunner::qt_metacall (this=0x7fffffffdfc0, _c=QMetaObject::InvokeMetaMethod, _id=3, _a=0x7fffffffd960) at debug/moc_TestRunner.cpp:88
    #12 0x00007ffff7864b27 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib/libQtCore.so.4
    #13 0x00007ffff77ea41c in ?? () from /usr/lib/libQtCore.so.4
    #14 0x00007ffff77eacb9 in QProcess::qt_metacall(QMetaObject::Call, int, void**) () from /usr/lib/libQtCore.so.4
    #15 0x00007ffff7864b27 in QMetaObject::activate(QObject*, QMetaObject const*, int, void**) () from /usr/lib/libQtCore.so.4
    #16 0x00007ffff78b0b1e in QSocketNotifier::activated(int) () from /usr/lib/libQtCore.so.4
    #17 0x00007ffff7869653 in QSocketNotifier::event(QEvent*) () from /usr/lib/libQtCore.so.4
    #18 0x00007ffff784ccdc in QCoreApplication::notifyInternal(QObject*, QEvent*) () from /usr/lib/libQtCore.so.4
    #19 0x00007ffff787954a in ?? () from /usr/lib/libQtCore.so.4
    #20 0x00007ffff4d87342 in g_main_context_dispatch () from /lib/libglib-2.0.so.0
    #21 0x00007ffff4d8b2a8 in ?? () from /lib/libglib-2.0.so.0
    #22 0x00007ffff4d8b45c in g_main_context_iteration () from /lib/libglib-2.0.so.0
    #23 0x00007ffff7879193 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
    #24 0x00007ffff784ba02 in QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
    #25 0x00007ffff784bdec in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /usr/lib/libQtCore.so.4
    #26 0x00007ffff784febb in QCoreApplication::exec() () from /usr/lib/libQtCore.so.4
    #27 0x00007ffff7bab5ff in CuteTest::TestConsoleFrontend::main (argc=1, argv=0x7fffffffe118) at ../src/TestConsoleFrontend.cpp:64
    #28 0x0000000000406744 in main (argc=1, argv=0x7fffffffe118) at ../../monprojet/test/test.cpp:30

    Le contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void TestCase::addIncident(const TestIncident& incident) {
        this->m_data->m_incidents.append(incident);
     
        // Update incident count
        this->m_data->m_counts[incident.type()]++;
    ...
    C'est la dernière ligne (5 ici) qui fait planter. Je ne vois pas bien le rapport que peut avoir QDebug, sans doute une histoire de threads ? (je n'y connais rien)

  5. #5
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Bonjour,

    Sur plusieurs tests, c'est toujours au même endroit que cela plante ? Ce que je proposais, en plus de rechercher une occurrence chez CuteTest, était d'utiliser qInstallMsgHandler() afin de choisir comment afficher les messages de qDebug()/qCritical()/etc... de façon à utiliser par exemple std::cerr et de voir si cela fonctionne mieux.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  6. #6
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Sur plusieurs tests ça plante toujours au même endroit oui, donc j'imagine qu'il s'agit d'une fragilité interne à CuteTest. Surtout que ça plante de la même façon avec le msghandler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void msgHandler(QtMsgType, const char* msg)
    {
        std::cerr << msg << std::endl;
    }
     
    int main(int argc, char *argv[])
    {
        qInstallMsgHandler(msgHandler);
        return CuteTest::TestConsoleFrontend::main(argc, argv);
    }
    Quand on regarde la pile il ne me semble pas que qDebug() soit appelé du tout. Donc ça plante avant ça, j'ai du mal à comprendre ce qui pourrait modifier le comportement de la lib, avant que le code différent soit exécuté (puisque sans qDebug() ça ne plante pas).

Discussions similaires

  1. CR XI : un rapport qui plante avec une imprimante particulière help !
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 27/09/2007, 09h54
  2. Mon application plante avec TMainMenu
    Par SOPSOU dans le forum Composants VCL
    Réponses: 1
    Dernier message: 07/09/2007, 14h54
  3. [Apache 2.0 - PHP5.2]apache plante avec les dll de PDO
    Par developpeur_mehdi dans le forum Apache
    Réponses: 5
    Dernier message: 02/12/2006, 21h33
  4. IDLE plante avec Tkinter
    Par von_magnus dans le forum EDI/RAD
    Réponses: 2
    Dernier message: 06/07/2006, 07h20
  5. X plante avec glutEnterGameMode()
    Par Funraill.net dans le forum Linux
    Réponses: 3
    Dernier message: 03/06/2006, 12h52

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