Gdb ou GNU Project Debugger est un excellent outil lorsque vous devez déboguer un programme. Vous pouvez définir des points d'arrêt, surveiller le changement de valeur d'une variable ou même modifier une valeur pour le programme alors qu'il est arrêté à un point de son état, puis continuer, juste pour choisir certaines des fonctionnalités de gdb.
Dans ce didacticiel, nous allons installer gdb sur RHEL 8 et tester son fonctionnement avec une simple application C.
Dans ce didacticiel, vous apprendrez :
- Comment installer gdb
- Comment compiler une application C simple avec des symboles de débogage
- Comment définir des points d'arrêt dans l'application en cours d'exécution avec gdb
- Comment imprimer les valeurs réelles de variables données dans l'application
Parcourir une boucle for avec gdb.
Configuration logicielle requise et conventions utilisées
Catégorie | Exigences, conventions ou version du logiciel utilisée |
---|---|
Système | Red Hat Enterprise Linux 8 |
Logiciel | gdb 8.2 |
Autre | Accès privilégié à votre système Linux en tant que root ou via le sudo commande. |
Conventions | # - nécessite que les commandes linux données soient exécutées avec les privilèges root soit directement en tant qu'utilisateur root, soit en utilisant sudo commande$ – nécessite que les commandes linux données soient exécutées en tant qu'utilisateur normal non privilégié |
Comment installer gdb dans Redhat Linux 8 instructions étape par étape
Pour ce didacticiel, nous utiliserons une application C simple qui définit certaines variables, imprime du texte et modifie ultérieurement les valeurs de ses variables. Il est construit uniquement pour montrer certaines fonctionnalités de gdb
, et n'a aucune utilisation dans le monde réel.
Si vous n'êtes pas familier avec le langage de programmation C, vous pouvez consulter le développement C sur Linux Introduction pour vous aider à démarrer. Pour l'instant, considérons le code source suivant, que nous allons mettre dans le vars.c
fichier texte :
#include <stdio.h>
int main()
{
int i = 1;
int j = 10;
printf("Variables set\n)";
i++;
j = 20;
printf("Variable values modified\n");
return 0;
}
Nous allons utiliser ce programme simple pour tester gdb
. Vous pouvez remarquer dans le code que les variables de valeurs i
et j
take ne sera jamais exposé dans le cadre de l'exécution normale du programme, nous ne saurons donc pas quelles sont leurs valeurs, où et quand. Dans ce cas, il s'agit d'un simple gaspillage de mémoire, mais pensez à un cas d'utilisation où i
contiendrait quelque chose d'important, peut-être un mot de passe codé en dur, un code de triche ou un autre trésor (ou ne peut tout simplement pas trouver où les calculs de votre programme se trompent).
gdb
fait partie desDevelopment Tools
groupe de packages, donc si vous avez installé les outils de développement, vous avez déjà gdb. Sinon, vous pouvez l'installer tout seul :# dnf install gdb
Nous aurons également besoin de debuginfo pour la glibc pour nos tests :
# dnf debuginfo-install glibc-2.28-18.el8.x86_64
- Nous avons obtenu l'outil de débogage et nous avons obtenu le code source. Pour que le débogage soit utile, nous devons compiler notre programme avec des symboles de débogage (nous ajoutons le
-g
option):$ gcc -g -o vars vars.c
Si nous exécutons nos
vars
programme, il affichera les chaînes dans leprintf
lignes, mais ne mentionnera pasi
etj
, comme prévu.$ ./vars Variables set Variable values modified
- Nous devons connaître les valeurs de
i
etj
lorsqu'ils ont été définis pour la première fois et avant la fermeture du programme. Considérez les lignes #7 et #10 (leprintf
lignes) dans la source. Ce serait idéal si nous pouvions arrêter l'exécution à ces lignes, obtenir les valeurs, puis relâcher le programme, etc. Nous ferons exactement cela pour testergdb
. Nous le commençons avec lesvars
compilés exécutable comme argument :$ gdb vars GNU gdb (GDB) Red Hat Enterprise Linux 8.2-3.el8 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from vars...done. (gdb)
gdb
lit les symboles dans le programme et nous invite à agir. Lesvars
le programme n'est pas lancé à ce stade. Nous vérifions nos notes et définissons unbreakpoint
à la ligne #7 :(gdb) break 7 Breakpoint 1 at 0x40059c: file vars.c, line 7.
Et la ligne 10 :
(gdb) break 10 Breakpoint 2 at 0x4005b1: file vars.c, line 10.
Une fois les points d'arrêt définis, nous commençons l'exécution :
(gdb) run Starting program: /tmp/devel/vars Breakpoint 1, main () at vars.c:7 7 printf("Variables set\n");
L'exécution s'arrête au premier point d'arrêt, et nous pouvons imprimer les valeurs des variables cachées :
(gdb) print i $1 = 1 (gdb) print j $2 = 10
Nous avons obtenu la première partie des informations nécessaires, continuons l'exécution :
(gdb) continue Continuing. Variables set Breakpoint 2, main () at vars.c:10 10 printf("Variable values modified\n");
Nous pouvons imprimer les valeurs de la même manière au prochain point d'arrêt :
(gdb) print i $3 = 2 (gdb) print j $4 = 20
Nous avons tout ce dont nous avions besoin. Il ne reste plus de points d'arrêt, donc l'application se fermera normalement après l'impression de la dernière ligne de texte.
(gdb) continue Continuing. Variable values modified [Inferior 1 (process 2330) exited normally] (gdb) q
Nous avons obtenu les valeurs des variables secrètes et testé que notre
gdb
est aussi utile qu'il est censé l'être.