Le débogueur GNU est utilisé pour déboguer un programme, pour analyser un plantage ou pour voir ce que le programme fait à un moment donné. Il a été développé par le projet GNU dans les années 1980 et a été l'un des débogueurs en ligne de commande les plus utilisés ainsi que l'un des logiciels GNU les plus populaires.
Écrivons d'abord un petit programme C que nous déboguerons ensuite. Pour commencer, créez un nouveau .c
fichier utilisant vigueur
ou tout éditeur de votre choix :
test vim.c
Créez le programme C suivant :
#include int main() { int i = 5; flottant f = 5,5 i = i + 3 ; f = f + 2,2 ; printf("Les valeurs de i et f sont : %d et %f\n", i, f); renvoie 0 ; }
presse S'échapper
pour passer en mode commande vim. Tapez ensuite :wq
pour enregistrer le programme et quitter.
Compilez et voyez si le programme s'exécute :
gcc test.c -o test ./test Les valeurs de i et f sont : 8 et 7.70000
Pour activer la prise en charge du débogage dans un programme, nous le compilons avec -g
drapeau. Si l'indicateur n'est pas utilisé, l'utilisateur peut toujours déboguer le programme, bien qu'avec des options limitées.
gcc test.c -g -o test
Pour commencer le débogage notre fichier exécutable test
dans gdb
, nous courrons:
test gdb
Il ouvrira le gdb
console, où vous pouvez taper le gdb
commandes. Pour voir une liste de commandes, utilisez le aider
commander.
$(gdb) help Liste des classes de commandes : alias -- Alias d'autres commandes points d'arrêt -- Arrêt du programme à certains points data -- Examen des fichiers de données -- Spécification et examen des fichiers internes -- Commandes de maintenance obscures -- Fonctions obscures en cours d'exécution -- Exécution de la pile du programme -- Examen de l'état de la pile -- Prise en charge des demandes d'état -- Points de trace des installations de prise en charge -- Traçage de l'exécution du programme sans arrêter le programme défini par l'utilisateur -- Commandes définies par l'utilisateur Tapez « help » suivi d'un nom de classe pour une liste de commandes dans cette classe. Tapez "help all" pour la liste de toutes les commandes. Tapez "help" suivi du nom de la commande pour une documentation complète. Tapez « à propos du mot » pour rechercher les commandes liées au « mot ». Les abréviations de nom de commande sont autorisées si elles ne sont pas ambiguës.
Vous pouvez alors taper aide class_name
pour voir les commandes appartenant à cette classe. Pour rechercher des commandes à l'aide d'une sous-chaîne, utilisez à propos de la sous-chaîne
.
Pour définir un point d'arrêt lorsque le programme entre dans une fonction, Cours:
$(gdb) pause principale
Ici, nous définissons un point d'arrêt sur la seule fonction de notre code, c'est-à-dire principale
. Utilisez la commande Cours
pour exécuter le programme jusqu'au prochain point d'arrêt, ou jusqu'à la sortie.
$(gdb) exécuter
Pour définir un point d'arrêt à un emplacement particulier dans une fonction, utiliser:
pause *principal + 4
Cela mettra en place un point d'arrêt à la 4ème ligne de la fonction main.
À présent, pour franchir le flux du programme jusqu'à la ligne de code suivante, exécutez simplement le étape
commander.
$(gdb) étape 5 : float f = 5,5 ;
Pour afficher le contenu d'une variable, Cours affichage
.
$(gdb) affiche i 6 : i = 5
Pour modifier le contenu d'une variable, qui pourrait être nécessaire pour analyser l'exécution d'un programme sous des valeurs spécifiques d'une variable, exécuter définir la variable =Expression
.
$(gdb) définir la variable i=10 $(gdb) afficher i 7 : i = 10
Ici, l''expression' peut être n'importe quelle expression (arithmétique/logique) valide. Par souci de simplicité, nous attribuons simplement une autre valeur (10) à la variable je
.
Pour imprimer le code assembleur du programme, utiliser la commande désassembler le nom de la fonction
:
Utilisez juste démonter
pour imprimer le code assembleur pour l'ensemble du programme. Notez la flèche à une ligne particulière dans le code assembleur. Cela indique que la session de débogage est actuellement suspendue à cet emplacement de mémoire particulier (c'est-à-dire cette ligne de code).
Pour sauter le débogueur à une ligne de code particulière, Cours:
$(gdb) jump *main + 2 Continuation à 0x400528. Point d'arrêt 2, 0x000000000040052a dans main () à test.c:3 3 int main() { 1 : i = 2 : f = 3 : h = (void *) 0x0 4 : main = {int ()} 0x400526 5 : i =
Cela fera sauter le débogueur à l'emplacement mémoire de la 2ème ligne de code en fonction principale
. Notez qu'ici, j'ai sauté du début du principal au deuxième emplacement directement. Par conséquent, variable je
n'a jamais été défini, ce qui entraîne l'erreur du débogueur indiquant qu'il ne peut pas accéder au contenu de la mémoire à l'adresse de la variable je
.
Voici quelques-unes des commandes de base qui peuvent vous aider à démarrer le débogage d'un fichier exécutable sous Linux. Nous espérons que les informations de cette page vous seront utiles.