Rechercher

Chapitre 3. Débogage des applications

download PDF

Le débogage des applications est un sujet très vaste. Cette partie fournit au développeur les techniques les plus courantes de débogage dans de multiples situations.

3.1. Activation du débogage avec les informations de débogage

Pour déboguer les applications et les bibliothèques, des informations de débogage sont nécessaires. Les sections suivantes décrivent comment obtenir ces informations.

3.1.1. Informations de débogage

Lors du débogage d'un code exécutable, deux types d'informations permettent aux outils, et par extension au programmeur, de comprendre le code binaire :

  • le texte du code source
  • une description de la manière dont le texte du code source est lié au code binaire

Ces informations sont appelées "informations de débogage".

Red Hat Enterprise Linux utilise le format ELF pour les binaires exécutables, les bibliothèques partagées ou les fichiers debuginfo. Dans ces fichiers ELF, le format DWARF est utilisé pour contenir les informations de débogage.

Pour afficher les informations DWARF stockées dans un fichier ELF, exécutez la commande readelf -w file commande.

Important

STABS est un format plus ancien et moins performant, utilisé occasionnellement avec UNIX. Son utilisation est déconseillée par Red Hat. GCC et GDB fournissent la production et la consommation de STABS sur une base de meilleur effort seulement. D'autres outils tels que Valgrind et elfutils ne fonctionnent pas avec STABS.

Ressources supplémentaires

3.1.2. Débogage des applications C et C avec GCC

Les informations de débogage étant volumineuses, elles ne sont pas incluses par défaut dans les fichiers exécutables. Pour permettre le débogage de vos applications C et C avec elle, vous devez explicitement demander au compilateur de la créer.

Pour permettre la création d'informations de débogage avec GCC lors de la compilation et de l'édition de liens, utilisez l'option -g:

$ gcc ... -g ...
  • Les optimisations effectuées par le compilateur et l'éditeur de liens peuvent aboutir à un code exécutable difficile à relier au code source original : les variables peuvent être optimisées, les boucles déroulées, les opérations fusionnées avec les opérations environnantes, etc. Cela a un impact négatif sur le débogage. Pour améliorer l'expérience de débogage, envisagez de définir l'optimisation avec l'option -Og. Cependant, la modification du niveau d'optimisation modifie le code exécutable et peut changer le comportement réel, y compris la suppression de certains bogues.
  • Pour inclure également les définitions de macros dans les informations de débogage, utilisez l'option -g3 au lieu de -g.
  • L'option -fcompare-debug GCC teste le code compilé par GCC avec des informations de débogage et sans informations de débogage. Le test est réussi si les deux fichiers binaires résultants sont identiques. Ce test garantit que le code exécutable n'est pas affecté par les options de débogage, ce qui permet de s'assurer qu'il n'y a pas de bogues cachés dans le code de débogage. Notez que l'utilisation de l'option -fcompare-debug augmente de manière significative le temps de compilation. Voir la page de manuel de GCC pour plus de détails sur cette option.

Ressources supplémentaires

3.1.3. Paquets debuginfo et debugsource

Les paquets debuginfo et debugsource contiennent des informations de débogage et le code source de débogage pour les programmes et les bibliothèques. Pour les applications et les bibliothèques installées dans des paquets provenant des dépôts de Red Hat Enterprise Linux, vous pouvez obtenir des paquets distincts debuginfo et debugsource à partir d'un canal supplémentaire.

Types de paquets d'informations de débogage

Il existe deux types de paquets disponibles pour le débogage :

Paquets Debuginfo
Les paquets debuginfo fournissent les informations de débogage nécessaires pour fournir des noms lisibles par l'homme pour les caractéristiques du code binaire. Ces paquets contiennent des fichiers .debug, qui contiennent des informations de débogage DWARF. Ces fichiers sont installés dans le répertoire /usr/lib/debug.
Paquets Debugsource
Les paquets debugsource contiennent les fichiers sources utilisés pour compiler le code binaire. Lorsque les paquets debuginfo et debugsource sont installés, les débogueurs tels que GDB ou LLDB peuvent relier l'exécution du code binaire au code source. Les fichiers du code source sont installés dans le répertoire /usr/src/debug.

3.1.4. Obtenir les paquets d'informations de débogage pour une application ou une bibliothèque à l'aide de GDB

Les informations de débogage sont nécessaires pour déboguer le code. Pour le code installé à partir d'un paquetage, le débogueur GNU (GDB) reconnaît automatiquement les informations de débogage manquantes, résout le nom du paquetage et fournit des conseils concrets sur la manière d'obtenir le paquetage.

Conditions préalables

Procédure

  1. Lancez GDB attaché à l'application ou à la bibliothèque que vous souhaitez déboguer. GDB reconnaît automatiquement les informations de débogage manquantes et suggère une commande à exécuter.

    $ gdb -q /bin/ls
    Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done.
    (no debugging symbols found)...done.
    Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.30-6.el8.x86_64
    (gdb)
  2. Quittez GDB : tapez q et confirmez avec Enter.

    (gdb) q
  3. Exécutez la commande suggérée par GDB pour installer les paquets debuginfo requis :

    # dnf debuginfo-install coreutils-8.30-6.el8.x86_64

    L'outil de gestion des paquets dnf fournit un résumé des changements, demande une confirmation et, une fois que vous avez confirmé, télécharge et installe tous les fichiers nécessaires.

  4. Si GDB n'est pas en mesure de suggérer le paquet debuginfo, suivez la procédure décrite dans Obtenir manuellement les paquets debuginfo pour une application ou une bibliothèque.

3.1.5. Obtenir manuellement les paquets d'informations de débogage pour une application ou une bibliothèque

Vous pouvez déterminer manuellement les paquets debuginfo que vous devez installer en localisant le fichier exécutable, puis le paquet qui l'installe.

Note

Red Hat vous recommande d'utiliser GDB pour déterminer les paquetages à installer. Utilisez cette procédure manuelle uniquement si GDB n'est pas en mesure de suggérer le paquetage à installer.

Conditions préalables

  • L'application ou la bibliothèque doit être installée sur le système.
  • L'application ou la bibliothèque a été installée à partir d'un paquetage.
  • L'outil debuginfo-install doit être disponible sur le système.
  • Les canaux fournissant les paquets debuginfo doivent être configurés et activés sur le système.

Procédure

  1. Rechercher le fichier exécutable de l'application ou de la bibliothèque.

    1. Utilisez la commande which pour trouver le fichier d'application.

      $ which less
      /usr/bin/less
    2. Utilisez la commande locate pour trouver le fichier de la bibliothèque.

      $ locate libz | grep so
      /usr/lib64/libz.so.1
      /usr/lib64/libz.so.1.2.11

      Si les raisons initiales du débogage comprennent des messages d'erreur, choisissez le résultat où le nom de fichier de la bibliothèque contient les mêmes nombres supplémentaires que ceux mentionnés dans les messages d'erreur. En cas de doute, essayez de suivre le reste de la procédure avec le résultat où le nom de fichier de la bibliothèque ne comporte pas de chiffres supplémentaires.

      Note

      La commande locate est fournie par le paquet mlocate. Pour l'installer et permettre son utilisation :

      # dnf install mlocate
      # updatedb
  2. Rechercher le nom et la version du paquet qui a fourni le fichier :

    $ rpm -qf /usr/lib64/libz.so.1.2.7
    zlib-1.2.11-10.el8.x86_64

    La sortie fournit des détails sur le paquet installé au format name:epoch-version.release.architecture.

    Important

    Si cette étape ne donne aucun résultat, il n'est pas possible de déterminer quel paquet a fourni le fichier binaire. Plusieurs cas sont possibles :

    • Le fichier est installé à partir d'un paquet qui n'est pas connu des outils de gestion des paquets dans leur configuration current.
    • Le fichier est installé à partir d'un paquet téléchargé localement et installé manuellement. Dans ce cas, il est impossible de déterminer automatiquement un paquetage debuginfo approprié.
    • Vos outils de gestion des paquets sont mal configurés.
    • Le fichier n'est pas installé à partir d'un paquetage. Dans ce cas, il n'existe pas de paquetage debuginfo correspondant.

    Comme les étapes suivantes dépendent de celle-ci, vous devez résoudre cette situation ou interrompre la procédure. La description des étapes exactes du dépannage dépasse le cadre de cette procédure.

  3. Installez les paquets debuginfo à l'aide de l'utilitaire debuginfo-install. Dans la commande, utilisez le nom du paquet et les autres détails que vous avez déterminés à l'étape précédente :

    # debuginfo-install zlib-1.2.11-10.el8.x86_64
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.