Techniques de débogageNous présentons ici quelques conseils utiles pour le débogage de logiciels basés sur Qt. Configurer Qt pour le débogageLorsque vous configurez Qt pour l'installation, il est possible de demander à ce que les symboles de débogage soient inclus à la compilation, ce qui peut faciliter la recherche de bogues dans les applications et les bibliothèques. Cependant, sur certaines plateformes, compiler Qt en mode débogage peut faire grossir les applications au-delà de la taille souhaitée. Débogage sur Mac OS X avec XcodeDébogage avec et sans frameworkLes informations de base sur les bibliothèques et frameworks de débogage se trouvent sur developer.apple.com le portail des développeurs Apple dans une note sur les techniques d'Apple TN2124. Lorsque vous compilez Qt, les frameworks sont compilés par défaut et, dans le framework, vous trouverez à la fois une version release et une version debug (par exemple, QtCore et QtCore_debug). Si vous passez l'option -no-framework lorsque vous compilez Qt, deux dylib sont créées pour chaque bibliothèque Qt (par exemple, libQtCore.4.dylib et libQtCore_debug.4.dylib). Le comportement au moment de l'édition des liens dépend de l'usage ou non des frameworks. Nous ne voyons pas de raison majeure de recommander l'un ou l'autre. Avec frameworkÉtant donné que les bibliothèques release et debug sont dans le framework, l'application est simplement liée avec le framework. Lorsque vous exécutez dans le débogueur, vous aurez la version debug ou release, suivant que vous aurez défini DYLD_IMAGE_SUFFIX ou pas. Si vous ne le définissez pas, vous aurez la version release par défaut (c'est-à-dire non _debug). Si vous définissez DYLD_IMAGE_SUFFIX=_debug, vous aurez la version debug. Sans frameworkQuand vous demandez à qmake de générer un Makefile avec la configuraion debug, il va faire un lien avec les versions _debug des bibliothèques et générer des symboles de débogage pour l'application. L'exécution de ce programme dans GDB fonctionnera comme sur les autres plateformes et vous pourrez tracer les appels à l'intérieur de Qt. Taille des symboles de débogageLa place prise par les symboles de débogage générés par GCC peut être excessivement grande. Cependant, à partir de la version 2.3 de Xcode, il est possible d'utiliser les symboles Dwarf (nains), qui prennent nettement moins de place. Pour activer cette option à la configuration de Qt, passez l'option -dwarf-2 au script de configuration. Cette option n'est pas activée par défaut, car les versions précédentes de Xcode ne fonctionnent pas avec l'option de compilation utilisée pour l'implémenter. Mac OS X 10.5 utilisera les symboles dwarf-2 par défaut. Les symboles dwarf-2 contiennent des références au code source, la taille de l'application debug finale devrait donc pouvoir être comparée plus favorablement à celle d'une version release. Options de ligne de commande reconnues par QtLorsque vous exécutez une application Qt, vous pouvez spécifier plusieurs options de ligne de commande pouvant aider au débogage. Elles sont reconnues par QApplication.
Messages d'avertissement et de débogageQt inclut quatre fonctions globales pour l'écriture de texte d'avertissement et de débogage. Elles correspondent aux usages suivants :
Si vous incluez le fichier d'en-tête <QtDebug>, la fonction qDebug() peut aussi être utilisée comme flux de sortie. Par exemple : qDebug() << "Widget" << widget << "à la position" << widget->pos(); L'implémentation de ces fonctions envoie le texte vers la sortie stderr sous Unix/X11 et Mac OS X. Sous Windows, s'il s'agit d'une application console, le texte est envoyé à la console ; sinon, il est envoyé au débogueur. Vous pouvez réimplémenter ces fonctions en installant un gestionnaire de messages avec qInstallMsgHandler(). Si la variable d'environnement QT_FATAL_WARNINGS est définie, qWarning() termine le programme après l'impression du message d'erreur. Cela permet de retrouver facilement l'origine de la trace dans le débogueur. qDebug() et qWarning() sont des outils de débogage. Elles peuvent être éliminées de l'exécutable en définissant QT_NO_DEBUG_OUTPUT et QT_NO_WARNING_OUTPUT à la compilation. Les fonctions de débogage QObject::dumpObjectTree() et QObject::dumpObjectInfo() sont souvent utiles lorsque les applications se comportent étrangement. Elles sont plus utiles si vous utilisez les noms d'objet mais elles peuvent aussi être utilisées sans ces derniers. Vous pouvez implémenter l'opérateur de flux utilisé par qDebug() pour fournir un meilleur support du débogage par vos classes. La classe implémentant le flux est QDebug. Les fonctions que vous avez besoin de connaître dans QDebug sont space() et nospace(). Elles renvoient toutes les deux un flux ; la différence est dans l'insertion ou non d'un espace entre les éléments. Voici l'exemple d'une classe représentant des coordonnées 2D.QDebug operator<<(QDebug dbg, const Coordinate &c) { dbg.nospace() << "(" << c.x() << ", " << c.y() << ")"; return dbg.space(); } L'intégration de vos propres types dans le système de méta-objets de Qt est décrit en profondeur dans le document Créer des types Qt personnalisés. Macros de débogageLe fichier d'en-tête <QtGlobal> contient des macros de débogage et des #define. Trois macros importantes sont :
Ces macros sont utiles pour la détection d'erreurs dans les programmes, par exemple comme ceci : char *alloc(int size) { Q_ASSERT(size > 0); char *ptr = new char[size]; Q_CHECK_PTR(ptr); return ptr; } Q_ASSERT(), Q_ASSERT_X() et Q_CHECK_PTR() ne génèrent pas de code si QT_NO_DEBUG est défini pendant la compilation. Pour cette raison, les arguments de ces macros ne doivent pas avoir d'effet de bord. Voici un usage incorrect de Q_CHECK_PTR() : char *alloc(int size) { char *ptr; Q_CHECK_PTR(ptr = new char[size]); // FAUX return ptr; } Si ce code est compilé avec QT_NO_DEBUG défini, le code dans l'expression Q_CHECK_PTR() n'est pas exécuté et alloc renvoie un pointeur non initialisé. La bibliothèque Qt contient des centaines de contrôles internes qui vont produire des messages d'avertissement quand une erreur de programmation est détectée. Nous recommandons donc d'utiliser une version de débogage de Qt pendant le développement de logiciels basés sur Qt. Bogues courantsIl existe un bogue tellement courant qu'il mérite d'être mentionné ici : si vous incluez la macro Q_OBJECT dans une déclaration de classe et exécutez le compilateur de méta-objets (moc) mais oubliez de lier le code objet généré par le moc dans votre exécutable, vous obtiendrez des messages d'erreur difficiles à interpréter. Les erreurs de lien signalant l'absence de vtbl, _vtbl, __vtbl ou des choses similaires sont probablement une manifestation de ce problème. RemerciementsMerci à Ilya Diallo pour la traduction ainsi qu'à Jonathan Courtois, Thibaut Cuvelier et Maxime Gault pour la relecture ! |
Cette page est une traduction d'une page de la documentation de Qt, écrite par Nokia Corporation and/or its subsidiary(-ies). Les éventuels problèmes résultant d'une mauvaise traduction ne sont pas imputables à Nokia. | Qt 4.7 | |
Copyright © 2024 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon, vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD. | ||
Vous avez déniché une erreur ? Un bug ? Une redirection cassée ? Ou tout autre problème, quel qu'il soit ? Ou bien vous désirez participer à ce projet de traduction ? N'hésitez pas à nous contacter ou par MP ! |