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.
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.
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.
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.
https://qiita.com/ShikiSumiya/items/a08363db88f21c81d351
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