Chapitre 3. Débogage des applications
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.
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
- Utilisation de la collection de compilateurs GNU (GCC) - Options pour déboguer votre programme
- Débogage avec GDB - Informations de débogage dans des fichiers séparés
La page du manuel GCC :
$ man gcc
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 paquetsdebuginfo
etdebugsource
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
- L'application ou la bibliothèque que vous souhaitez déboguer doit être installée sur le système.
-
GDB et l'outil
debuginfo-install
doivent être installés sur le système. Pour plus de détails, voir Configuration pour le débogage d'applications. -
Les dépôts fournissant les paquets
debuginfo
etdebugsource
doivent être configurés et activés sur le système. Pour plus de détails, voir Activation des référentiels de débogage et de sources.
Procédure
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)
Quittez GDB : tapez q et confirmez avec Enter.
(gdb) q
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.-
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.
Ressources supplémentaires
- Guide d'utilisation de Red Hat Developer Toolset, section Installation des informations de débogage
- Comment puis-je télécharger ou installer des paquets debuginfo pour les systèmes RHEL ? - Solution de la base de connaissances de Red Hat
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.
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
Rechercher le fichier exécutable de l'application ou de la bibliothèque.
Utilisez la commande
which
pour trouver le fichier d'application.$ which less /usr/bin/less
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.
NoteLa commande
locate
est fournie par le paquetmlocate
. Pour l'installer et permettre son utilisation :# dnf install mlocate # updatedb
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.
ImportantSi 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.
Installez les paquets
debuginfo
à l'aide de l'utilitairedebuginfo-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
Ressources supplémentaires