{"id":255812,"date":"2021-06-04T11:15:15","date_gmt":"2021-06-04T10:15:15","guid":{"rendered":"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/"},"modified":"2022-06-13T15:54:23","modified_gmt":"2022-06-13T14:54:23","slug":"7-conseils-essentiels-pour-deboguer-en-cpp","status":"publish","type":"clion","link":"https:\/\/blog.jetbrains.com\/fr\/clion\/2021\/06\/7-conseils-essentiels-pour-deboguer-en-cpp\/","title":{"rendered":"7 conseils essentiels pour d\u00e9boguer en C++"},"content":{"rendered":"<p>Nous avons eu le plaisir de nous entretenir avec Greg Law, qui a partag\u00e9 avec nous ses conseils pour d\u00e9boguer du code C++.<\/p>\n<table style=\"width: 100%; border-spacing: 0;\">\n<tbody>\n<tr style=\"background-color: #f1f6fe; font-size: 15px;\">\n<td style=\"width: 159px; padding: 0;\"><img decoding=\"async\" style=\"vertical-align: middle;\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/06\/greg_law.jpg\" alt=\"Greg Law\" width=\"159\" \/><\/td>\n<td style=\"padding: 0 0 0 15px;\"><span style=\"vertical-align: middle; display: inline-block; line-height: 1.8; color: #000;\">Greg (<a href=\"https:\/\/twitter.com\/gregthelaw\" target=\"_blank\" rel=\"noopener\">@gregthelaw<\/a>) est le cofondateur et dirigeant d&#8217;<a href=\"https:\/\/undo.io\" target=\"_blank\" rel=\"noopener\">Undo<\/a>. Programmeur exp\u00e9riment\u00e9, ses activit\u00e9s se partagent aujourd&#8217;hui entre les domaines du logiciel et des affaires. Il appr\u00e9cie tout particuli\u00e8rement de contribuer \u00e0 la distribution de technologies logicielles innovantes. Greg a plus de 20 ans d&#8217;exp\u00e9rience, \u00e0 la fois dans le milieu universitaire et au sein de startups du secteur logiciel.<br \/><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Brian Kernighan a d\u00e9clar\u00e9 : <em>\u00ab\u00a0Tout le monde sait qu&#8217;il est deux fois plus difficile de d\u00e9boguer un programme que de l&#8217;\u00e9crire. Alors si vous mettez toute votre intelligence au service de l&#8217;\u00e9criture de votre code, comment allez-vous pouvoir le d\u00e9boguer ?\u00a0\u00bb<\/em>. Selon moi, cela ne signifie pas seulement qu&#8217;il faille \u00ab\u00a0rester simple\u00a0\u00bb et \u00e9crire du code clair, facile \u00e0 lire et \u00e0 comprendre. Cela signifie \u00e9galement que le d\u00e9bogage est un \u00e9l\u00e9ment central de la programmation : vous ne pouvez pas exceller dans la programmation sans exceller dans le d\u00e9bogage. J&#8217;esp\u00e8re que mes conseils de d\u00e9bogage pour C++ vous aideront \u00e0 \u00eatre aussi talentueux et productif lors du d\u00e9bogage de votre code que lorsque vous l&#8217;avez \u00e9crit.<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#have_a_full_kit_of_debugging_tools\">#1 Disposer d&#8217;un kit d&#8217;outils de d\u00e9bogage complet<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#conditional_breakpoints\">#2 Points d&#8217;arr\u00eat conditionnels<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#watchpoints\">#3 Points de surveillance<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#user_defined_debugging_commands_in_python\">#4 Commandes de d\u00e9bogage d\u00e9finies par l&#8217;utilisateur en Python<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#pretty_print_structures\">#5 Structures pretty-print<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#time_travel_debugging\">#6\u00a0Time Travel Debugging<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#command_find_to_search_for_a_byte_sequence\">#7 Commande find pour rechercher une s\u00e9quence d&#8217;octets<\/a><\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/clion\/2021\/06\/7-top-tips-for-debugging-cpp\/#want_more_cpp_debugging_tips\">Vous voulez d&#8217;autres conseils de d\u00e9bogage pour C++ ?<\/a><\/li>\n<\/ul>\n<p align=\"center\"><a class=\"jb-download-button\" href=\"https:\/\/www.jetbrains.com\/fr-fr\/clion\/download\/\" target=\"_blank\" rel=\"noopener\"><i class=\"download-icon\"><\/i>Essayer le d\u00e9bogage dans CLion<\/a><\/p>\n<h2 id=\"have_a_full_kit_of_debugging_tools\">#1 Disposer d&#8217;un kit d&#8217;outils de d\u00e9bogage complet<\/h2>\n<p>Toutes choses \u00e9gales par ailleurs, un d\u00e9veloppeur disposant de bons outils \u00e9vitera et r\u00e9soudra les probl\u00e8mes plus rapidement qu&#8217;un d\u00e9veloppeur moins bien \u00e9quip\u00e9. Voici selon moi les 4\u00a0cat\u00e9gories d&#8217;outils de d\u00e9bogage que tout programmeur devrait savoir comment et quand utiliser. J&#8217;ai inclus dans cette liste des outils payants et des outils gratuits open source :<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Cat\u00e9gorie\u00a0<\/strong><\/td>\n<td><strong>Comment il vous aide<\/strong><\/td>\n<td><strong>Exemples d&#8217;outils<\/strong><\/td>\n<\/tr>\n<tr>\n<td>D\u00e9bogueur interactif<\/td>\n<td>Mettre en pause l&#8217;ex\u00e9cution et comprendre \u00ab\u00a0Que fait mon programme ?\u00a0\u00bb<\/td>\n<td>GDB, strace<\/td>\n<\/tr>\n<tr>\n<td>Time travel debugger<\/td>\n<td>Revenir en arri\u00e8re et avancer dans le temps d&#8217;ex\u00e9cution pour comprendre comment votre programme est arriv\u00e9 l\u00e0 o\u00f9 il est.<\/td>\n<td>UDB, rr, WinDbg<\/td>\n<\/tr>\n<tr>\n<td>V\u00e9rificateurs de code dynamiques<\/td>\n<td>Analyser ou instrumenter votre code pour v\u00e9rifier les d\u00e9bordements de m\u00e9moire tampon et autres d\u00e9fauts.<\/td>\n<td>Valgrind, ASan<\/td>\n<\/tr>\n<tr>\n<td>V\u00e9rificateurs de code statiques<\/td>\n<td>Analyser votre code pour d\u00e9terminer s&#8217;il y a des risques de survenance de d\u00e9fauts sp\u00e9cifiques.<\/td>\n<td>Analyseur Clang et Clang-Tidy, Coverity, Cppcheck, linters int\u00e9gr\u00e9s \u00e0 l&#8217;IDE<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Lors de notre <a href=\"https:\/\/www.youtube.com\/watch?v=qYbGDDIsH4M\" target=\"_blank\" rel=\"noopener\">intervention \u00e0 la conf\u00e9rence ACCU<\/a>, Dewang Li de Coverity et moi avons pass\u00e9 en revue ces cat\u00e9gories d&#8217;outils et expliqu\u00e9 comment ils fonctionnent sous le capot.<\/p>\n<p><em>Conseil d&#8217;Anastasia Kazakova, Chef de produit CLion chez JetBrains, sur l&#8217;utilisation du d\u00e9bogueur dans CLion<\/em> : non seulement CLion vous permet de d\u00e9boguer votre code avec les backends GDB ou LLDB, mais il facilite \u00e9galement l&#8217;utilisation d&#8217;autres outils, notamment l&#8217;<a href=\"https:\/\/www.jetbrains.com\/help\/clion\/profiling-tools.html\" target=\"_blank\" rel=\"noopener\">int\u00e9gration de Valgrind et Sanitizers<\/a>, ainsi que diff\u00e9rentes options pour <a href=\"https:\/\/www.jetbrains.com\/help\/clion\/code-inspection.html\" target=\"_blank\" rel=\"noopener\">l&#8217;analyse statique de code<\/a>.<\/p>\n<h2 id=\"conditional_breakpoints\">#2 Points d&#8217;arr\u00eat conditionnels<\/h2>\n<p>Un point d&#8217;arr\u00eat vous permet d&#8217;arr\u00eater l&#8217;ex\u00e9cution du programme \u00e0 une ligne ou \u00e0 une fonction sp\u00e9cifique dans votre code. Lorsque votre programme atteint un point d&#8217;arr\u00eat, il attend vos instructions pour inspecter ou manipuler l&#8217;\u00e9tat de l&#8217;application, reprendre l&#8217;ex\u00e9cution, etc.<br \/>J&#8217;utilise les points d&#8217;arr\u00eat conditionnels pour d\u00e9boguer plus efficacement. Au lieu de faire une pause \u00e0 chaque fois que le point d&#8217;arr\u00eat est atteint (ce qui peut \u00eatre fastidieux si le point d&#8217;arr\u00eat est d\u00e9fini dans une boucle), je peux d\u00e9finir une condition pour un point d&#8217;arr\u00eat qui arr\u00eate l&#8217;ex\u00e9cution si cette condition est remplie. Par exemple, si la variable \u00ab\u00a0i\u00a0\u00bb est normalement \u00e9gale \u00e0 z\u00e9ro, je peux vouloir arr\u00eater l&#8217;ex\u00e9cution du programme si \u00ab\u00a0i\u00a0\u00bb n&#8217;est pas \u00e9gale \u00e0 z\u00e9ro :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"\">(gdb) break my_func if i!=0<\/pre>\n<p>Vous pouvez \u00e9crire pratiquement n&#8217;importe quelle condition de votre choix dans le langage de programmation du programme que vous d\u00e9boguez, ce qui rend les points d&#8217;arr\u00eat conditionnels tr\u00e8s puissants et efficaces. La condition peut inclure un appel de fonction, la valeur d&#8217;une variable ou le r\u00e9sultat de toute expression GDB.<br \/>Pour en savoir plus, regardez ce <a href=\"https:\/\/undo.io\/resources\/gdb-watchpoint\/gdb-breakpoints-types-conditional-breakpoints-rege\/\" target=\"_blank\" rel=\"noopener\">tutoriel vid\u00e9o<\/a> dans lequel je pr\u00e9sente les points d&#8217;arr\u00eat conditionnels, ainsi que plusieurs autres types de points d&#8217;arr\u00eat, et explique comment utiliser chacun d&#8217;eux pour le d\u00e9bogage.<\/p>\n<p><em>Conseil d&#8217;Anastasia sur l&#8217;utilisation du d\u00e9bogueur dans CLion<\/em> : Dans CLion, vous pouvez <a href=\"https:\/\/www.jetbrains.com\/help\/clion\/using-breakpoints.html#breakpoint-properties\" target=\"_blank\" rel=\"noopener\"> facilement sp\u00e9cifier<\/a> une condition \u00e0 contr\u00f4ler \u00e0 chaque fois qu&#8217;un point d&#8217;arr\u00eat est atteint.<\/p>\n<h2 id=\"watchpoints\">#3 Points de surveillance<\/h2>\n<p>Comme le point d&#8217;arr\u00eat, un point de surveillance arr\u00eate l&#8217;ex\u00e9cution, mais il le fait chaque fois que la <em>valeur<\/em> d&#8217;une expression change, sans que le programmeur n&#8217;ait \u00e0 pr\u00e9voir pr\u00e9cis\u00e9ment \u00e0 quelle ligne de code cela peut se produire. Les points de surveillance sont extr\u00eamement utiles pour d\u00e9boguer en cas de probl\u00e8me de concurrence, par exemple lorsqu&#8217;on essaie de comprendre quel thread ou processus modifie une ressource partag\u00e9e. L&#8217;expression peut \u00eatre simple (la valeur d&#8217;une seule variable) ou complexe (de nombreuses variables combin\u00e9es par des op\u00e9rateurs). Quelques exemples :<\/p>\n<ul>\n<li>Une r\u00e9f\u00e9rence \u00e0 la valeur d&#8217;une seule variable.<\/li>\n<li>Une adresse convertie en un type de donn\u00e9es appropri\u00e9. Par exemple, <code>*(int *)0x12345678<\/code> surveillera une zone de 4 octets \u00e0 l&#8217;adresse sp\u00e9cifi\u00e9e (en supposant qu&#8217;un int occupe 4 octets).<\/li>\n<li>Une expression arbitrairement complexe, telle que <code>a*b + c\/d<\/code>. L&#8217;expression peut utiliser tous les op\u00e9rateurs valides dans le langage natif du programme.<\/li>\n<\/ul>\n<p>Voici un <a href=\"https:\/\/undo.io\/resources\/gdb-watchpoint\/watchpoints-more-than-watch-and-continue\/\" target=\"_blank\" rel=\"noopener\">article de blog et une vid\u00e9o<\/a> expliquant comment utiliser les diff\u00e9rents types de points de surveillance.<\/p>\n<p><em>Conseil d&#8217;Anastasia sur l&#8217;utilisation du d\u00e9bogueur dans CLion<\/em> : Si vous vous demandez comment ajouter un point de surveillance dans CLion, consultez l&#8217;<a href=\"https:\/\/www.jetbrains.com\/help\/clion\/using-watchpoints.html\" target=\"_blank\" rel=\"noopener\">aide en ligne<\/a>.<\/p>\n<h2 id=\"conditional_breakpoints\">#4 Commandes de d\u00e9bogage d\u00e9finies par l&#8217;utilisateur en Python<\/h2>\n<p>Je vous recommande de personnaliser votre d\u00e9bogueur en fonction de votre projet et de votre \u00e9quipe. Dans GDB, vous pouvez le faire en cr\u00e9ant des commandes d\u00e9finies par l&#8217;utilisateur en Python. Vous pouvez effectuer toutes sortes d&#8217;actions intelligentes pour faciliter la d\u00e9tection de bugs \u00e9pineux (et leur r\u00e9solution). Il y a aussi beaucoup de moyens de personnaliser GDB en fonction de votre projet et de vos besoins pour le d\u00e9bogage.<br \/>Il serait dommage de ne pas tirer parti de Python et de vous priver de la possibilit\u00e9 d&#8217;augmenter la vitesse de votre d\u00e9bogage et de vous simplifier la vie ! C&#8217;est un petit investissement en temps qui en vaut vraiment la peine et qui sera rapidement rentabilis\u00e9.<br \/>Par exemple, vous pouvez automatiser une t\u00e2che telle que la v\u00e9rification de la sortie du d\u00e9bogueur dans le contr\u00f4le de la source et la partager avec les membres de votre \u00e9quipe. Dans cet article, je montre comment l&#8217;<a href=\"https:\/\/undo.io\/resources\/gdb-watchpoint\/python-gdb\/\" target=\"_blank\" rel=\"noopener\">int\u00e9gration de<\/a><a href=\"https:\/\/undo.io\/resources\/gdb-watchpoint\/python-gdb\/\" target=\"_blank\" rel=\"noopener\"> Python avec GDB<\/a> peut \u00eatre utilis\u00e9e \u00e0 cette fin.<\/p>\n<p><em>Conseil d&#8217;Anastasia sur l&#8217;utilisation du d\u00e9bogueur dans CLion<\/em> : Saviez-vous que pendant une session de d\u00e9bogage vous pouvez acc\u00e9der \u00e0 la <a href=\"https:\/\/www.jetbrains.com\/help\/clion\/debugger-console.html\" target=\"_blank\" rel=\"noopener\"> console GDB\/LLDB<\/a> directement depuis CLion ? L&#8217;onglet montre le flux de sortie\/erreur du d\u00e9bogueur et vous permet d&#8217;ex\u00e9cuter des commandes GDB\/LLDB.<\/p>\n<h2 id=\"pretty_print_structures\">#5 Structures pretty-print<\/h2>\n<p>L&#8217;affichage des variables, des structures et des classes est une part importante du d\u00e9bogage. Par d\u00e9faut, le d\u00e9bogueur peut ne pas afficher \u00e0 l&#8217;\u00e9cran la valeur d&#8217;une mani\u00e8re qui soit facile \u00e0 comprendre pour le d\u00e9veloppeur.<br \/>Par exemple, si j&#8217;affiche la structure <code>siginfo_t<\/code>, la commande print renvoie toutes les donn\u00e9es de la structure et d\u00e9veloppe les unions qu&#8217;elle utilise\u00a0:<br \/>D\u00e9sordonn\u00e9 et difficile \u00e0 lire !<br \/>Heureusement, GDB peut \u00eatre \u00e9tendu avec les fonctions \u00ab\u00a0pretty-printer\u00a0\u00bb. Lorsque GDB imprime une valeur, il v\u00e9rifie s&#8217;il y a un pretty-printer enregistr\u00e9 pour cette valeur. Si c&#8217;est le cas, GDB l&#8217;utilise pour afficher la valeur. Sinon, la valeur s&#8217;affiche comme de mani\u00e8re habituelle.<br \/>La cr\u00e9ation de la fonction pretty-printer requiert un peu de codage en amont, mais elle vous \u00e9vitera de rester trop longtemps les yeux riv\u00e9s \u00e0 votre \u00e9cran par la suite. Voici une vid\u00e9o dans laquelle je pr\u00e9sente une <a href=\"https:\/\/undo.io\/resources\/gdb-watchpoint\/here-quick-way-pretty-print-structures-gdb\/\" target=\"_blank\" rel=\"noopener\">fa\u00e7on rapide de configurer un pretty-print de structure dans GDB<\/a>.<\/p>\n<p><em>Conseil d&#8217;Anastasia sur l&#8217;utilisation du d\u00e9bogueur dans CLion<\/em> : Si vous ajoutez des pretty-printers personnalis\u00e9s \u00e0 GDB, CLion les utilisera par d\u00e9faut.<\/p>\n<h2 id=\"time_travel_debugging\">#6\u00a0Time Travel Debugging<\/h2>\n<p>Il arrive souvent que les d\u00e9veloppeurs aient besoin de savoir ce que leurs programmes ont r\u00e9ellement fait par rapport \u00e0 ce qu&#8217;ils \u00e9taient cens\u00e9s faire. C&#8217;est pourquoi le d\u00e9bogage implique g\u00e9n\u00e9ralement de reproduire un bug de nombreuses fois, en collectant progressivement de plus en plus d&#8217;informations jusqu&#8217;\u00e0 ce quel&#8217;on puisse trouve la cause.<br \/>Le d\u00e9bogage dans le temps \u00e9limine toutes ces conjectures et ces t\u00e2tonnements : le d\u00e9bogueur peut vous dire directement ce qui vient de se passer.<br \/>Des d\u00e9bogueurs gratuits comme GDB ont une fonction Time Travel Debugging int\u00e9gr\u00e9e. Cela fonctionne assez bien, mais vous devez \u00eatre pr\u00eat\u00b7e \u00e0 sacrifier une grande partie des performances. Les d\u00e9bogueurs payants con\u00e7us pour permettre le d\u00e9bogage dans le temps, comme <a href=\"https:\/\/undo.io\/solutions\/products\/udb\/\" target=\"_blank\" rel=\"noopener\">UDB<\/a>, offrent des performances beaucoup plus rapides.<br \/>Le processus est identique \u00e0 celui d&#8217;un d\u00e9bogage classique, si ce n&#8217;est que vous pouvez enregistrer l&#8217;ex\u00e9cution d&#8217;un programme en cours d&#8217;ex\u00e9cution, puis reculer ou avancer dans le temps. Les points d&#8217;arr\u00eat et les points de surveillance fonctionnent en sens inverse. Cela permet par exemple de passer directement \u00e0 un point pr\u00e9c\u00e9dent dans le programme o\u00f9 une variable sp\u00e9cifique change. Les points de surveillance invers\u00e9s peuvent \u00eatre incroyablement puissants. J&#8217;ai vu plusieurs cas dans lesquels des bugs ayant \u00e9chapp\u00e9 \u00e0 un d\u00e9veloppeur pendant des mois, voire des ann\u00e9es, ont \u00e9t\u00e9 r\u00e9solus en quelques heures gr\u00e2ce aux points de surveillance invers\u00e9s.<br \/>Dans cette vid\u00e9o, je pr\u00e9sente le <a href=\"https:\/\/undo.io\/resources\/cppcon-2015-greg-law-give-me-15-minutes-ill-change\/\" target=\"_blank\" rel=\"noopener\">d\u00e9bogage invers\u00e9 dans GDB<\/a>. Jetez-y un \u0153il : il vous montre \u00e9tape par \u00e9tape (en sens inverse) comment faire le suivi d&#8217;un d\u00e9faut dans mon programme.<\/p>\n<p><em>Conseil d&#8217;Anastasia sur l&#8217;utilisation du d\u00e9bogueur dans CLion<\/em> : Undo a cr\u00e9\u00e9 un <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/8620-time-travel-debug-for-c-c-\/\" target=\"_blank\" rel=\"noopener\">plugin CLion<\/a> pour le D\u00e9bogueur Time Travel d&#8217;UDB. Consultez notre pr\u00e9c\u00e9dent <a href=\"https:\/\/blog.jetbrains.com\/clion\/2016\/09\/undo-for-clion\/\">article<\/a> en collaboration avec l&#8217;\u00e9quipe d&#8217;Undo pour en savoir plus.<\/p>\n<h2 id=\"command_find_to_search_for_a_byte_sequence\">#7 Commande find pour rechercher une s\u00e9quence d&#8217;octets<\/h2>\n<p>Parfois durant d\u00e9bogage vous pouvez avoir besoin de trouver une s\u00e9quence d&#8217;octets en particulier dans l&#8217;espace m\u00e9moire du programme. Peut-\u00eatre voulez-vous voir tous les pointeurs vers un objet sp\u00e9cifique. Ainsi, chacun des huit octets de la m\u00e9moire qui correspond \u00e0 la s\u00e9quence d&#8217;octets constitue une adresse que vous voulez identifier.<\/p>\n<p>La commande <code>find<\/code> de GDB vous fournit un autre type d&#8217;inspection de votre programme. Toutes les valeurs de recherche sont interpr\u00e9t\u00e9es dans le langage de programmation du programme. Par exemple, le langage source de hello.c est le C\/C++. Ainsi, si nous recherchons la cha\u00eene de caract\u00e8res \u00ab\u00a0Hello, world !\u00a0\u00bb, elle inclut le <code>'\\0'<\/code> de fin.<\/p>\n<p>GDB fournit \u00e9galement des informations sur les mappages de m\u00e9moire des processus du programme, ce qui vous aide \u00e0 concentrer la recherche dans certains segments de la m\u00e9moire du programme. L&#8217;adresse de chaque correspondance trouv\u00e9e et le nombre de correspondances sont renvoy\u00e9s.<\/p>\n<h2 id=\"want_more_cpp_debugging_tips\">Vous voulez d&#8217;autres conseils de d\u00e9bogage en C++ ?<\/h2>\n<p>J&#8217;ai partag\u00e9 sept conseils pour am\u00e9liorer la productivit\u00e9 du d\u00e9bogage en C++. J&#8217;esp\u00e8re qu&#8217;ils vous seront utiles. Parfois, il suffit de quelques petits ajustements dans notre routine de d\u00e9bogage pour faire une grande diff\u00e9rence. N&#8217;h\u00e9sitez pas \u00e0 partager ces conseils ! J&#8217;aimerais \u00e9galement conna\u00eetre vos astuces. Vous pouvez me contacter sur <a href=\"https:\/\/twitter.com\/gregthelaw\" target=\"_blank\" rel=\"noopener\">Twitter<\/a> ou sur <a href=\"https:\/\/www.linkedin.com\/in\/gregthelaw\/\" target=\"_blank\" rel=\"noopener\">LinkedIn<\/a>.<br \/>Voici quelques ressources sur le d\u00e9bogage qui pourront vous \u00eatre utiles :<\/p>\n<ul>\n<li><a href=\"https:\/\/undo.io\/resources\/gdb-watchpoint\/\" target=\"_blank\" rel=\"noopener\">GDBWatchpoint<\/a>\u00a0: Abonnez-vous \u00e0 mon blog sur undo.io<\/li>\n<li><a href=\"https:\/\/www.gnu.org\/software\/gdb\/download\/\" target=\"_blank\" rel=\"noopener\">Obtenir GDB<\/a>\u00a0: D\u00e9bogueur C\/C++ gratuit<\/li>\n<li><a href=\"https:\/\/undo.io\/udb-form\/\" target=\"_blank\" rel=\"noopener\">UDB<\/a> : D\u00e9bogueur Time Travel (essai gratuit de 30\u00a0jours)<\/li>\n<\/ul>\n<p>Et quelques ressources suppl\u00e9mentaires concernant CLion, l&#8217;IDE de JetBrains :<\/p>\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/playlist?list=PLQ176FUIyIUawCufBKmmWkRq2t5sl1xsM\" target=\"_blank\" rel=\"noopener\">S\u00e9rie de vid\u00e9os sur le d\u00e9bogueur dans CLion<\/a><\/li>\n<li><a href=\"https:\/\/www.jetbrains.com\/fr-fr\/lp\/clion-debugging\/\" target=\"_blank\" rel=\"noopener\">Une pr\u00e9sentation des capacit\u00e9s du d\u00e9bogueur de CLion<\/a><\/li>\n<\/ul>\n<p>Merci \u00e0 Greg d&#8217;avoir partag\u00e9 ces conseils !<\/p>\n<p>Et vous, quelle est votre astuce de d\u00e9bogage pr\u00e9f\u00e9r\u00e9e ? N&#8217;h\u00e9sitez pas \u00e0 nous le dire dans les commentaires !<\/p>\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n<p>\u00a0<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":255826,"comment_status":"closed","ping_status":"closed","template":"","categories":[601],"tags":[6649,632,3581,6651,6648,6650],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/clion\/255812"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/clion"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/clion"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=255812"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/clion\/255812\/revisions"}],"predecessor-version":[{"id":255863,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/clion\/255812\/revisions\/255863"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/255826"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=255812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=255812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=255812"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=255812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}