Débogage C / C ++ avec gdb

Erreur de segmentation (core dump)

Ce message est presque toujours ennuyeux lors de l'écriture de C ou C ++ C'est l'un des endroits où les débutants peuvent facilement trébucher car la cause de l'erreur n'est pas transmise directement au terminal.

Occurrence de vidage de mémoire

Lambda:11	Em:1.01	ARI:0
Lambda:11	Em:1.02	ARI:0.290903
Segmentation fault (Vidage de base)

Une erreur de segmentation (core dump) se produit lors de l'exécution du Programme de clustering (apprentissage automatique non supervisé) .. Soudain, le programme s'est arrêté. Un outil appelé gdb peut vous aider à en trouver la cause.

Qu'est-ce que gdb

https://ja.wikipedia.org/wiki/GNU%E3%83%87%E3%83%90%E3%83%83%E3%82%AC

Le débogueur GNU (également simplement GDB) est un débogueur standard qui fonctionne sur les systèmes logiciels GNU. C'est un débogueur hautement portable qui fonctionne sur de nombreux systèmes Unix et prend en charge les langages de programmation tels que Ada, C, C ++, FORTRAN et FreeBASIC.

gdb est un débogueur standard Unix CUI. Les IDE tels que eclipse et Visual Studio vous permettent d'utiliser le débogueur GUI par défaut, mais le but est similaire à ceux-ci.

comment utiliser

Commencez par compiler avec "-g" ajouté à l'option de compilation.

g++ [nom de fichier] -g -o

De nombreuses distributions Linux ont la fonctionnalité CoreDump désactivée par défaut, alors activez-la.

ulimit -c unlimited

La signification de cette commande est qu'elle ne limite pas la taille du Core à générer.

Exécutez le programme.

./a.out
...
(réduction)
...
Lambda:11	Em:1.01	ARI:0
Lambda:11	Em:1.02	ARI:0.290903
Segmentation fault (Vidage de base)

Si vous regardez le répertoire courant ici, vous devriez voir un fichier nommé "core". Déboguons ce noyau avec GDB.

gdb ./a.out core

GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
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-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 ./a.out...done.
[New LWP 10366]
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00005599dc02eccb in Hcm::set_crispMembership (this=0x7ffcf0375ea0) at hcm.cxx:159
159	    CrispMembership[max_index][k]=1.0;

Le nom de la fonction à l'origine du problème est écrit en bas ici.

Je veux regarder de plus près, donc je vais revenir en arrière.

(gdb) backtrace
#0  0x00005599dc02eccb in Hcm::set_crispMembership (this=0x7ffcf0375ea0) at hcm.cxx:159
#1  0x00005599dc03c300 in main () at qfcma_main_user_knowledge.cxx:112

Je veux voir la cause de la fonction principale en détail, alors spécifiez # 1.

(gdb) frame 1
112	      test.set_crispMembership();

Vous avez maintenant identifié la fonction qui a provoqué le vidage de mémoire.

Vous pouvez également afficher le code de la cause et des variables locales si nécessaire. Veuillez vous référer à l'article suivant pour plus de détails.

Article plus détaillé sur gdb

https://qiita.com/ShikiSumiya/items/a08363db88f21c81d351

Postscript

La cause de ce vidage de mémoire était que NaN était généré en raison de la limite de calcul de la variable de type double, et une référence hors tableau s'est produite suite à une tentative de référence au NaN stocké dans le tableau.

Recommended Posts

Débogage C / C ++ avec gdb
En forme de conteneur réalisé avec C # 1
analyse json avec gdb
Déboguer le pipeline avec Metaflow
Débogage facile avec ipdb
Utilisation de X11 avec ubuntu18.04 (langage C)
Essayez Google Mock avec C
Débogage avec pdb en Python
Utile lors du débogage avec TouchDesigner
Formater la source du langage C avec pycparser
Débogage à distance avec Visual Studio 2017
Résoudre ABC163 A ~ C avec Python
Appeler C depuis Python avec DragonFFI
Créer Awaitable avec l'API Python / C
Ecriture du langage C avec Sympy (métaprogrammation)
Résoudre ABC168 A ~ C avec Python
Résolu AtCoder ABC 114 C-755 avec Python3
Résoudre ABC162 A ~ C avec Python
Résoudre ABC167 A ~ C avec Python
Résoudre ABC158 A ~ C avec Python
Segfo avec 16 caractères en langage C
Accélérer la compilation C / C ++ avec ccache
Assembleur X86 sous Linux (lien avec C)
Liaison multilingue C / C ++ facile avec CMake + SWIG
[C] [python] Lire avec AquesTalk sous Linux
Utilisation des fonctions C ++ de python avec pybind11
RaspberryPi L Chika avec Python et C #
[C, C ++, Python, JavaScript] L Chika avec Edison
Communiquez avec les périphériques I2C sous Linux C