[LINUX] C / C ++ - Debugging mit gdb

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.

Auftreten des Core Dumps

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.

Was ist gdb

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.

wie benutzt man

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.

Ausführlicherer Artikel über gdb

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

Nachtrag

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

C / C ++ - Debugging mit gdb
Behälterartig hergestellt mit C # 1
json parsing mit gdb
Debug-Pipeline mit Metaflow
Einfaches Debuggen mit ipdb
Verwenden von X11 mit ubuntu18.04 (C-Sprache)
Versuchen Sie Google Mock mit C.
Debuggen mit pdb in Python
Nützlich beim Debuggen mit TouchDesigner
Formatieren Sie die Sprachquelle C mit pycparser
Remote-Debugging mit Visual Studio 2017
Löse ABC163 A ~ C mit Python
Rufen Sie C von Python mit DragonFFI auf
Erstellen Sie Awaitable mit der Python / C-API
Schreiben der C-Sprache mit Sympy (Metaprogrammierung)
Löse ABC168 A ~ C mit Python
AtCoder ABC 114 C-755 mit Python3 gelöst
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Segfo mit 16 Zeichen in C-Sprache
Beschleunigen Sie die C / C ++ - Kompilierung mit ccache
X86 Assembler unter Linux (Verknüpfung mit C)
Einfache mehrsprachige C / C ++ - Bindung mit CMake + SWIG
[C] [Python] Lesen mit AquesTalk unter Linux
Verwenden von C ++ - Funktionen aus Python mit pybind11
RaspberryPi L Chika mit Python und C #
[C, C ++, Python, JavaScript] L Chika mit Edison
Kommunizieren Sie mit I2C-Geräten unter Linux C.