Informations de débogage gdb et principe de débogage

    Pour le développement de programmes C ++ sous Linux, même si des outils de compilation tels que makefile et cmake sont utilisés, le groupe d'outils de compilation gcc est finalement appelé . L' ensemble d'outils mentionné ici est dû au fait qu'il existe encore une petite différence entre les outils de compilation utilisés pour compiler les programmes C et les programmes C ++. Généralement , gcc est utilisé pour  compiler des programmes C et g ++ est utilisé pour compiler des programmes C ++  . (Pour la commodité de la description ci-dessous, sauf indication contraire, aucune distinction spécifique n'est faite entre gcc et g ++, et le terme gcc est utilisé de manière uniforme.)

Le système d'exploitation que j'utilise dans ce cours est CentOS 7.0, qui est une démonstration de compte root pour la commodité de la démonstration. Si gcc et gdb ne sont pas installés sur la machine du lecteur, vous pouvez utiliser la   commande yum pour les installer.

# 安装 gcc
yum install gcc
# 安装 g++
yum install gcc-c++
# 安装 gdb
yum install gdb

copie

Généralement, un programme doit être débogué. Afin de voir clairement les informations de chaque ligne de code en cours de débogage, appelées informations de pile, noms de variables et noms de fonctions, le débogueur doit contenir des informations de symbole de débogage . Lorsque vous utilisez  gcc pour  compiler un programme, si l'  option -g est ajoutée  , les informations du symbole de débogage peuvent être conservées dans le programme compilé. Par exemple, la commande suivante générera un programme hello_server avec des informations de débogage.

gcc -g -o hello_server hello_server.c

copie

Alors, comment juger si hello_server contient des informations de débogage? Nous utilisons gdb pour déboguer ce programme, gdb affichera les informations de débogage du programme correctement lu, entrez gdb hello_server dans le terminal Linux Shell ouvert pour   voir les résultats affichés:

[root@localhost testclient]# gdb hello_server
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1
Copyright (C) 2013 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".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/testclient/hello_server...done.
(gdb)

copie

Une fois gdb chargé, les informations suivantes s'affichent:

Reading symbols from /root/testclient/hello_server...done.

copie

Autrement dit, la fin de la lecture du fichier de symboles indique que le programme contient des informations de débogage. Essayons à  nouveau sans l'  option -g :

[root@localhost testclient]# gcc -o hello_server2 hello_server.c
[root@localhost testclient]# gdb hello_server2
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1
Copyright (C) 2013 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".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/testclient/hello_server2...(no debugging symbols found)...done.
(gdb)

copie

Les lecteurs attentifs devraient voir la différence. Lors de l'  utilisation de gdb pour déboguer et générer le programme hello_server 2 sans l'  option -g , l'invite suivante sera reçue lors de la lecture des informations du symbole de débogage:

Reading symbols from /root/testclient/hello_server2...(no debugging symbols found)...done.

copie

En passant, en plus de ne pas ajouter l'option -g, vous pouvez également utiliser la commande de bande Linux pour supprimer les informations de débogage dans un programme. Essayons la commande de bande sur hello_server:

[root@localhost testclient]# strip hello_server
##使用 strip 命令之前
-rwxr-xr-x. 1 root root 12416 Sep 8 09:45 hello_server
##使用 strip 命令之后
-rwxr-xr-x. 1 root root 6312 Sep 8 09:55 hello_server

copie

On constate qu'après avoir utilisé la commande strip sur hello_server, le programme est nettement plus petit (réduit de 12416 octets à 6312 octets). Nous publions généralement le programme dans l'environnement de production ou l'environnement formel après le test du programme sans aucun problème, de sorte que le programme sans informations de symbole de débogage est généré pour réduire la taille du programme ou améliorer l'efficacité de l'exécution du programme.

Utilisons gdb pour vérifier que les informations de débogage de ce programme sont bien supprimées:

[root@localhost testclient]# gdb hello_server
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1
Copyright (C) 2013 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".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/testclient/hello_server...(no debugging symbols found)...done.
(gdb)

copie

Deux explications supplémentaires:

  • Bien que gcc soit utilisé comme exemple dans ce cours, l'option -g est en fait également applicable aux programmes Linux compilés avec des outils tels que makefile et cmake.
  • Lors de la génération réelle d'un débogueur, en général, non seulement l'option -g doit être ajoutée, mais il est également recommandé de désactiver l'option d'optimisation de programme du compilateur. Les options d'optimisation du programme du compilateur ont généralement cinq niveaux, de O0 à O4 (notez que le premier O0 est la lettre O plus le nombre 0), O0 signifie aucune optimisation, de O1 à O4 le niveau d'optimisation est de plus en plus élevé, et O4 est le plus élevé. Le but de ceci est pour le débogage, les variables de débogage affichées dans le fichier de symboles peuvent correspondre complètement au code source. Par exemple, supposons le code suivant:
  int func()
  {
      int a = 1;
      int b = a + 1;
      int c = a + b;
      return a + b + c;
  }

  int main()
  {
      int a = func();
      printf("%d\n", a);
  }

copie

Dans ce code, comme la fonction func () est appelée dans la fonction main (), la valeur de la fonction func () peut être directement calculée lors de la compilation. Si l'option d'optimisation est activée, les variables locales de cette fonction sont en fait débogué. a, b, c sont remplacés par des valeurs directes (c'est-à-dire, la valeur calculée par le compilateur, a utilise directement 1, b utilise directement 2, et c utilise directement 3, ce qui ne produira pas le calcul b par a et c par les instructions a et b), même la fonction func () peut être optimisée. Si cela se produit, il peut y avoir des différences entre le code affiché par le débogueur et le code réel, ce qui entraînera des difficultés de dépannage. Bien sûr, que le phénomène d'optimisation mentionné ci-dessus se produise définitivement, différentes versions du compilateur peuvent avoir des comportements différents. En un mot, il est recommandé de désactiver les options d'optimisation du compilateur lors de la génération de fichiers de débogage .

sommaire

Cette leçon présente principalement l'installation d'outils tels que gdb et l'importance des symboles de débogage pour le débogage. En même temps, il convient de prêter attention à l'impact des options d'optimisation du compilateur sur l'exactitude du débogage.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_38293850/article/details/107974741
conseillé
Classement