I. L'article original

Qt Labs est un site géré par les développeurs de Qt. Ils y publient des projets, des idées propres et des composants afin d'obtenir les retours d'informations sur les API, le code et les fonctionnalités ou simplement pour partager avec nous ce qui les intéressent. Le code que vous y trouverez peut fonctionner tel quel mais c'est sans aucune garantie ni support. Voir les conditions d'utilisation pour plus d'informations.

Nokia, Qt, Qt Labs et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.

Cet article est la traduction de l'article Peek and Poke, par André paru dans Qt Labs.

II. Introduction

Rappelez-vous les jours où tous les outils à votre disposition ressemblaient à un interpréteur Basic avec 30 commandes, les plus utilisables étant PEEK, POKE et PRINT ? Oui, cela fait un moment déjà...

Pourtant, il y a quelques mois, je me suis retrouvé à devoir refaire beaucoup de débogage "à la printf". Même avec un support basique d'EDI qui affiche bien les QString et les QByteArray, creuser dans des structures plus complexes n'était vraiment pas plaisant. Une des raisons pour cela était certainement que les humains aiment penser un QHash à un niveau d'abstraction plus élevé, d'une manière assez différente de l'implémentation actuelle et c'est seulement l'implémentation bas niveau qu'un débogueur voit habituellement.

Une solution consiste à combler l'écart entre le bas niveau (pointeurs, unions anonymes...) et le haut niveau (un groupe de clés avec les valeurs associées) en apparence. Cela est réalisé en demandant au débogueur le type d'un objet uniquement et, ensuite, au lieu de demander les données bas niveau, lui dire quelle partie de la mémoire de l'application est une clé de hachage et quelle partie est la valeur correspondante. Cette information est ensuite transmise à la vue "Variables locales et observateurs" de Qt Creator.

Ci-dessous, le résultat de quelques conteneurs imbriqués et deux QObject avec une relation parent-enfant :

Image non disponible Image non disponible
Image non disponible Image non disponible


Pour ce dernier, une approche plus "traditionnelle" d'affichage bas niveau aurait produit :

Image non disponible


L'affichage bas niveau d'un QHash est cependant moins impressionnant. Bien sûr, Qt Creator peut aisément changer de vue mais cela est rarement nécessaire.

Pour la commodité de l'audience la moins Qt-centrée, des affichages semblables ont été ajoutés pour quelques conteneurs largement utilisés de la bibliothèque standard C++, en voici la preuve :

Image non disponible Image non disponible


L'affichage des types mentionnés ci-dessus (et quelques autres) fonctionne déjà avec Qt Creator 1.1 d'avril sur Linux, Windows et Mac. La seule chose nécessaire est une version pas trop ancienne du débogueur GNU. Gdb version 6.8 convient parfaitement et est largement répandue. Sur Mac, le gdb d'Apple fera l'affaire.

Le temps s'écoulant, le travail continue lui aussi. Qt Creator 1.2 sera capable d'afficher QAbstractItem, QAbstractItemModel, QByteArray, QDateTime, QDir, QFile, QFileInfo, QHash, QImage, QImageData, QLinkedList, QList, QLocale, QMap, QModelIndex, QMultiMap, QObject, QSet, QSharedPointer, QString, QStringList, QTextCodec, QVariant, QVector, QWeakPointer, std::list, std::map, std::set, std::string, std::vector, std::wstring ainsi que quelques types d'aide (QMapData et autres). Si quelque chose vous manque désespérément, dites-le moi.

Dernier point mais non des moindres, une nouvelle spécialement pour les gens du côté Windows du monde : à partir de Creator 1.2, le frontend du débogueur supportera aussi le débogueur de Microsoft, avec le même affichage convivial des données complexes.

IX. Conclusion

Au nom de toute l'équipe Qt, j'aimerais adresser le plus grand remerciement à Nokia pour nous avoir autorisé la traduction de cet article !

Merci à ram-0000 pour sa relecture et ses conseils.