Maison > Tutoriel système > Linux > le corps du texte

L'évangile du débogage des programmes C sous Linux - gdb

王林
Libérer: 2024-02-11 20:12:02
avant
909 Les gens l'ont consulté

Chaque programmeur, quelle que soit son expérience, ne peut pas complètement éviter les bugs du logiciel. Par conséquent, le dépannage et la correction des bogues sont devenus l’une des tâches les plus cruciales du cycle de développement logiciel. Bien qu'il existe de nombreuses façons de résoudre les bogues, telles que les tests et l'auto-révision du code, un logiciel de débogage spécialisé peut également aider à identifier le problème afin qu'il puisse être résolu.

Pour les programmeurs qui utilisent le langage de programmation C/C++ ou Fortran et Modula-2 pour développer des logiciels, il existe un excellent outil de débogage, GDB, qui sera une bonne nouvelle pour eux. GDB aide non seulement les programmeurs à déboguer plus facilement les bogues et autres problèmes dans leur code, mais il fournit également de nombreuses fonctionnalités et options utiles. Dans cet article, nous aborderons quelques bases du débogueur GDB, ainsi que certaines des fonctionnalités et options utiles qu'il offre.

在 Linux 中调试 C 程序的福音——gdb

Avant de commencer, il convient de mentionner que toutes les instructions et exemples contenus dans l'article ont été testés sur Ubuntu 14.04 LTS. Les exemples de codes du didacticiel sont tous écrits en langage C ; le shell utilisé est bash (4.3.11) ; la version GDB est 7.7.1 ;

Bases du débogueur GDB

En termes simples, GDB vous permet de voir le flux interne du programme pendant l'exécution et vous aide à identifier le problème. Nous discuterons de l'utilisation du débogueur GDB avec un exemple fonctionnel dans la section suivante, mais avant cela, abordons quelques points de base qui vous aideront plus tard.

Tout d'abord, pour utiliser avec succès un débogueur comme GDB, vous devez compiler le programme d'une manière spécifiée afin que le compilateur génère les informations de débogage requises par le débogueur. Par exemple, lors de la compilation de code avec le compilateur gcc (que nous utiliserons pour compiler les exemples de programmes C plus loin dans ce didacticiel), vous devez utiliser l'option de ligne de commande -g.

Pour plus d'informations sur l'option de ligne de commande -g dans la page de manuel du compilateur gcc, veuillez consulter ici.

Ensuite, assurez-vous que le débogueur GDB est installé sur votre système. S'il n'est pas installé et que vous utilisez un système basé sur Debian (tel qu'Ubuntu), vous pouvez facilement installer l'outil à l'aide de la commande suivante :

sudo apt-get install gdb
Copier après la connexion

Pour les méthodes d'installation sur d'autres distributions, veuillez voir ici.

Maintenant, lorsque vous avez compilé le programme comme décrit ci-dessus (option de ligne de commande gcc -g) et installé le débogueur GDB, vous pouvez utiliser la commande suivante pour exécuter le programme en mode débogage :

gdb [可执行程序的名称]
Copier après la connexion

Faire cela initialisera le débogueur GDB, mais votre exécutable ne sera pas encore démarré. À ce stade, vous pouvez définir les paramètres liés au débogage. Par exemple, vous pouvez définir un point d'arrêt sur une ligne ou une fonction spécifique pour que GDB suspende l'exécution du programme sur cette ligne.

Ensuite, afin de démarrer votre programme, vous devez saisir et exécuter la commande gdb suivante :

run
Copier après la connexion
Copier après la connexion

Ici, il convient de mentionner que si votre programme nécessite certains paramètres de ligne de commande, vous pouvez spécifier ces paramètres ici. Par exemple :

run [参数]
Copier après la connexion

GDB fournit de nombreuses commandes utiles, qui peuvent toujours s'avérer utiles lors du débogage. Nous discuterons de certaines de ces commandes dans la section suivante.

Cas d'utilisation du débogueur GDB

Nous avons maintenant une idée de base de GDB et de son utilisation. Appliquons donc ce que nous avons appris avec un exemple. Voici un exemple de code :

#include 
int main()
{
    int out = 0, tot = 0, cnt = 0;
    int val[] = {5, 54, 76, 91, 35, 27, 45, 15, 99, 0};

    while(cnt printf("/n Total = [%d]/n", tot);
    return 0;
}
Copier après la connexion

Expliquez brièvement ce que fait ce code. Obtenez chaque valeur du tableau val, affectez-la à la variable out, puis ajoutez la valeur avant tot et la valeur résultat de 0xffffffff/out, et affectez-la à la variable tot.

Le problème rencontré ici est que lorsque le programme exécutable compilé par ce code est exécuté, l'erreur suivante est générée :

$ ./gdb-testFloating point exception (core dumped)
Copier après la connexion

Donc, pour déboguer ce code, la première étape consiste à compiler le programme en utilisant l'option -g. La commande est la suivante :

gcc -g -Wall gdb-test.c -o gdb-test
Copier après la connexion

Ensuite, exécutons le débogueur GDB et spécifions le programme exécutable à déboguer. La commande est la suivante :

gdb ./gdb-test
Copier après la connexion

Maintenant, l'erreur que je viens de recevoir est une exception à virgule flottante, qui, comme la plupart d'entre vous le savent probablement déjà, est causée par n % x lorsque x est 0. Donc, dans cet esprit, j'ai ajouté un point d'arrêt à la ligne 11 où se produit l'opération de division. Comme suit :

(gdb)&;break 11
Copier après la connexion

Remarque (gdb) correspond aux informations d'invite du débogueur, je n'ai entré que la commande break 11.

Maintenant, laissez GDB commencer à exécuter le programme :

run
Copier après la connexion
Copier après la connexion

Lorsque le point d'arrêt est atteint pour la première fois, GDB affiche le résultat suivant :

Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb)
Copier après la connexion

Comme vous pouvez le voir, le débogueur affiche la ligne de code où se trouve le point d'arrêt. Maintenant, imprimons la valeur de out à ce moment-là. Comme suit :

(gdb) print out
$1 = 5
(gdb)
Copier après la connexion

如上所示,值 5被打印出来了。这个时候一切都还是正常的。让调试器继续执行程序直到命中下一个断点,可以通过使用 c 命令来完成:

c
Copier après la connexion

重复上述操作,直到 out值变为0 时。

...
...
...
Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb) print out
$2 = 99
(gdb) c
Continuing.

Breakpoint 1, main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
(gdb) print out
$3 = 0
(gdb)
Copier après la connexion

现在,为了进一步确认问题,我使用 GDB 的s (或 step) 命令代替 c 命令。因为,我只想让当前程序在第 11 行之后暂停,再一步步执行,看看这个时候是否会发生崩溃。

以下是执行之后输出信息:

(gdb) s

Program received signal SIGFPE, Arithmetic exception.
0x080484aa in main () at gdb-test.c:11
11 tot = tot + 0xffffffff/out;
Copier après la connexion

是的,如上输出的第一行内容所示,这就是抛出异常的地方。当我再次尝试运行s 命令时,问题最终也得到了确认:

(gdb) s

Program terminated with signal SIGFPE, Arithmetic exception.
The program no longer exists.
Copier après la connexion

通过这种方式,你就可以使用 GDB 调试你的程序。

总结

GDB 提供了很多功能供用户研究和使用,在这里,我们仅仅只介绍了很少一部分内容。通过 GDB 的手册页可以进一步了解这个工具,当你在调试代码的时候,尝试使用一下它。GDB 调试器有一定的学习难度,但是它很值得你下功夫学习。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:lxlinux.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!