Dans la version 10.4, nous disposons d'un tout nouveau débogueur pour C++Builder pour Windows 64 bits, avec une inspection grandement améliorée du contenu des STL et d'autres types, ainsi qu'une meilleure stabilité.
Un nouveau débogueur
Avant d'entrer dans les détails, voici ce que nous livrons dans la version 10.4 : un nouveau débogueur pour C++ Win64 basé sur LLDB moderne et prenant en charge l'évaluation des types STL complexes et autres. Ce support pour les types complexes est également entièrement extensible si vous vous débattez avec vos propres structures de données complexes. Il s'agit d'une amélioration considérable de votre productivité, à la fois en termes de stabilité du débogueur et en termes de données disponibles lors du débogage.
Débogage historique de C++ sous Windows
En fonction du langage avec lequel votre application est construite, de la plate-forme et du bitness qu'elle vise, RAD Studio utilisera l'un des différents débogueurs et formats de fichiers pour les informations de débogage. Une plate-forme qui a nécessité une attention particulière est Win64 pour C++, pour deux raisons : la technologie des débogueurs et les effets secondaires du compilateur Clang.
Enjeux
Avant la version 10.4, C++ sur Win64 utilisait le format de débogage DWARF v2 et un débogueur personnalisé.
Bien que nous n'ayons pas l'habitude de mettre l'accent sur les problèmes dans les articles de blog, historiquement, ce débogueur n'a pas été exempt de problèmes. Certains clients ont pu rencontrer des erreurs de "session déconnectée", ce qui indique en fait une erreur ou un crash dans le débogueur (parfois dans l'application elle-même, que le débogueur n'a pas été en mesure de gérer). Parfois, l'IDE semblait se figer pendant un certain temps, ce qui était en fait l'attente de la fin du débogueur par l'IDE.
Inspection ou évaluation de types complexes
En outre, principalement en raison d'optimisations même en mode de débogage, il a été difficile d'inspecter le contenu de structures telles que les types STL. L'appel à des méthodes, comme c_str() pour évaluer une chaîne de caractères, pouvait ne pas être évalué si la méthode n'était pas liée, et donc non disponible pour le débogueur. Pour d'autres types, comme std::vector ou std::map, les méthodes d'accès étaient parfois intégrées, ou si elles n'étaient pas utilisées, elles n'étaient pas liées, et dans les deux cas, elles n'étaient pas non plus disponibles en tant que méthodes appelables pour le débogueur.
Il était donc difficile de voir les éléments du conteneur dans les infobulles, les variables locales, les évaluations/modifications, les veilles, etc. Au final, les données n'étaient pas toujours faciles à évaluer ou à visualiser.
Ces problèmes ne sont pas propres à C++Builder : autres IDE avoir lutté avec lui aussi. Il s'agit d'un problème courant en C++.
Dans la version 10.4, nous nous attaquons à ces deux problèmes en introduisant un nouveau débogueur pour C++. Le débogueur est basé sur une version moderne de LLDB, utilise un format de débogage récent, est stable, gère les types complexes, y compris les types STL courants, et est entièrement extensible.
Le nouveau débogueur C
Tout d'abord, les informations techniques. Dans la version 10.4, C++Builder utilise une version personnalisée de LLDB v9 pour le débogage Windows 64 bits. À ma connaissance, nous sommes le premier éditeur à prendre en charge LLDB pour Windows - bien qu'il s'agisse d'une norme courante et de facto sur d'autres plates-formes, ce n'est pas encore le cas sur Windows. (Nous avons également été les premiers à livrer et à prendre en charge Clang pour Windows, avec Clang 3.1 avec C++Builder XE3 en 2012.)
Nous couplons LLDB avec DWARF v4, en utilisant v4 au lieu de v5 pour diverses raisons techniques liées au compilateur Clang. Cela permet d'améliorer les informations de débogage disponibles, c'est-à-dire ce qui peut être "vu" et débogué.
En termes de stabilité, nous visons à ce que LLDB soit nettement plus stable que le précédent débogueur utilisé pour Win64. Les causes les plus courantes d'instabilité dans l'ancien débogueur, que nous avons étudiées et qui sont connues, ne sont pas présentes dans le nouveau débogueur. En outre, nous avons également amélioré l'interaction de l'IDE avec le débogueur, notamment en affichant des messages d'erreur plus informatifs.
Débogage des types complexes
Jusqu'à présent, tout va bien - nouveau débogueur, moderne, stable. La fonctionnalité la plus intéressante est cependant l'amélioration du débogage avec la prise en charge de STL et d'autres types complexes. En utilisant C++Builder 10.4, vous pourrez facilement évaluer et voir le contenu de vos vecteurs, cartes, chaînes de caractères et autres.
Pour résumer, il y a plusieurs raisons pour lesquelles l'inspection ou l'évaluation de types complexes peut être difficile en C++, pour toutes les chaînes d'outils C++. La première est que les structures de données sont compliquées : il n'est pas trivial de trouver un élément dans une std::map, et même dans une chaîne de caractères, les données peuvent être en format deux endroits différents. Cela signifie qu'il n'est pas facile de localiser manuellement les données. Par ailleurs, les méthodes utilisées pour accéder aux éléments doivent être accessibles au débogueur. Une méthode qui n'est jamais appelée sera optimisée ; une méthode qui est appelée peut être intégrée, même dans une version de débogage, étant donné la nature de la STL qui ne s'applique qu'aux en-têtes. Une méthode qui n'est pas liée ou qui est intégrée n'est pas appelable (elle n'existe pas en tant que méthode séparée et autonome) et le débogueur ne peut donc pas l'utiliser. Le résultat final est qu'il n'est pas toujours possible pour un débogueur d'évaluer le contenu d'une chaîne de caractères ou le énième élément d'un vecteur, parce qu'il ne comprend pas la disposition des données ou les méthodes qui enveloppent ces données.
C++Builder 10.4 utilisations Formateurs LLDB pour résoudre ce problème. Pour un type de données complexe, il existe un petit script Python qui comprend la structure de données. Le débogueur l'invoque et c'est ce script qui renvoie les données à afficher dans les vues Infobulle, Veille, Évaluer/Modifier, Inspecter et Variables locales.
Dans ces images, vous pouvez voir le débogueur C++ Win64 de la version 10.4 afficher le contenu de plusieurs types de chaînes (chaînes STL étroites et larges, chaînes Unicode, chaîne UTF8 Delphi) ; un shared_ptr affichant à la fois le contenu de l'élément pointé et le refcount, y compris les références faibles ; et le contenu d'un std::map, l'un des conteneurs STL les plus complexes.
La liste complète des formateurs que nous livrons dans la version 10.4 est la suivante :
- std::string
- std::wstring
- std::vector
- std::deque
- std::map
- std::shared_ptr
- Types de chaînes de caractères AnsiString, y compris UTF8String
- Chaîne/UnicodeString
- Chaîne large
Ces types sont les conteneurs STL les plus couramment utilisés, plus les types de chaînes STL, qui sont tous extrêmement courants et dont l'évaluation a pu poser des problèmes par le passé ; plus un pointeur intelligent pour lequel il est utile d'avoir plus d'informations que le simple objet pointé ; plus les types de chaînes Delphi. En d'autres termes, il s'agit d'un ensemble de types de grande valeur qui pourraient nécessiter une visualisation. (Ce n'est pas le cas de tous les types - une structure ou une classe moyenne convient parfaitement, et la majorité des types bénéficient du format de débogage amélioré et du débogueur sans avoir besoin d'un formateur. Les formateurs sont utiles pour les types complexes où la compréhension de la disposition de la mémoire ou des méthodes de débogage peut être nécessaire).
Vous pouvez également écrire ces scripts vous-même. Si votre application a des types de données complexes et que vous avez du mal à les évaluer, vous pouvez écrire un petit script pour présenter les données à l'intérieur de votre type de données comme vous le souhaitez. Le débogueur est entièrement extensible.
Dans l'ensemble
C++Builder 10.4 introduit un nouveau débogueur pour Win64. Basé sur une version récente de LLDB, il est stable et moderne. Il comprend également des formateurs permettant l'évaluation de types complexes, y compris les principaux types de données STL. Notre objectif est de rendre l'expérience du débogage dans la version 10.4 beaucoup plus stable et puissante, et beaucoup plus productive en faisant fonctionner les données de débogage de manière fluide et en présentant ce que vous voulez à l'écran.
Nous sommes très enthousiastes à l'idée de cette fonctionnalité et nous avons hâte que la version 10.4 de C++Builder soit publiée et que vous puissiez l'essayer !
Il s'agit d'un aperçu d'une version à venir de RAD Studio. Il peut toujours y avoir des bogues ou des changements de dernière minute. Rien n'est définitif tant que la version n'est pas officiellement disponible.

