Segmentierungsfehler (Core Dump )
Diese Meldung ist beim Schreiben von C oder C ++ fast immer ärgerlich Dies ist einer der Orte, an denen Anfänger leicht stolpern können, da die Fehlerursache nicht direkt an das Terminal ausgegeben wird.
Lambda:11 Em:1.01 ARI:0
Lambda:11 Em:1.02 ARI:0.290903
Segmentation fault (Core-Dump)
Segmentierungsfehler (Core Dump)
tritt beim Ausführen von [Programm zum Clustering (unbeaufsichtigtes maschinelles Lernen)] auf (https://github.com/Aqua-ix/clustering/blob/master/src/qfcma_main_user_knowledge.cxx) .. Plötzlich stoppte das Programm.
Ein Tool namens "gdb" kann Ihnen helfen, die Ursache dafür zu finden.
https://ja.wikipedia.org/wiki/GNU%E3%83%87%E3%83%90%E3%83%83%E3%82%AC
Der GNU-Debugger (auch einfach GDB) ist ein Standard-Debugger, der auf GNU-Softwaresystemen ausgeführt wird. Es ist ein hoch portabler Debugger, der auf vielen Unix-basierten Systemen funktioniert und Programmiersprachen wie Ada, C, C ++, FORTRAN und FreeBASIC unterstützt.
gdb ist ein Standard-Unix-CUI-Debugger. Mit IDEs wie Eclipse und Visual Studio können Sie den GUI-Debugger standardmäßig verwenden, der Zweck ist jedoch ähnlich wie bei diesen.
Kompilieren Sie zunächst mit "-g", das der Kompilierungsoption hinzugefügt wurde.
g++ [Dateiname] -g -o
Bei vielen Linux-Distributionen ist die Core Dump-Funktion standardmäßig deaktiviert. Aktivieren Sie sie daher.
ulimit -c unlimited
Die Bedeutung dieses Befehls ist, dass er die Größe des zu generierenden Kerns nicht begrenzt.
Führen Sie das Programm aus.
./a.out
...
(Kürzung)
...
Lambda:11 Em:1.01 ARI:0
Lambda:11 Em:1.02 ARI:0.290903
Segmentation fault (Core-Dump)
Wenn Sie sich das aktuelle Verzeichnis hier ansehen, sollte eine Datei mit dem Namen "core" angezeigt werden. Lassen Sie uns diesen Kern mit GDB debuggen.
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;
Der Name der Funktion, die das Problem verursacht, steht hier unten.
Ich möchte genauer hinsehen, also werde ich zurückverfolgen.
(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
Ich möchte die Ursache der Hauptfunktion im Detail sehen, also geben Sie # 1 an.
(gdb) frame 1
112 test.set_crispMembership();
Jetzt haben Sie die Funktion identifiziert, die den Core Dump verursacht hat.
Sie können bei Bedarf auch den Code für die Ursache und die lokalen Variablen anzeigen. Weitere Informationen finden Sie im folgenden Artikel.
https://qiita.com/ShikiSumiya/items/a08363db88f21c81d351
Die Ursache für diesen Core-Dump war, dass NaN aufgrund der Berechnungsgrenze der Variablen vom Doppeltyp generiert wurde und eine Referenz außerhalb der Sequenz als Ergebnis des Versuchs, auf das im Array gespeicherte NaN zu verweisen, auftrat.
Recommended Posts