2017-03-14 2 views
0

Mein Programm ist Multi-Thread. Ich habe eine Core-Datei und wenn ich versuche, es zu debuggen, habe ich das.Wie gdb eine Kerndatei mit seg Fehler in Centos 6.5?

Program terminated with signal 11, Segmentation fault. 
#0 memcpy() at ../sysdeps/x86_64/memcpy.S:91 
91  movl %ecx, (%rdi) 
Missing separate debuginfos, use: debuginfo-install libssh2-1.8.0-2.0.cf.rhel6.x86_64 
(gdb) bt 
#0 memcpy() at ../sysdeps/x86_64/memcpy.S:91 
#1 0x00007f981b342feb in ??() 
#2 0x00000000025f1ef0 in ??() 
#3 0x00000000025edef0 in ??() 
#4 0x00007fff4b65a810 in ??() 
#5 0x0000000000000001 in ??() 
#6 0x00000000025cb800 in ??() 
#7 0x00000000025ccea0 in ??() 
#8 0x0000000000000000 in ??() 

Warum die bt Infos sind "???" Kann ich den Thread und gegebenenfalls den Seg-Fehler identifizieren?

Vielen Dank.

+2

Sie sollten Ihr Programm mit Debug-Informationen kompilieren. – mch

+2

Sie fehlen die Debug-Symbole werden von GDB verwendet, um Rückverfolgungen zu drucken. Sie sollten Ihre Binärdatei mit dem Flag "-g" kompilieren. Versuchen Sie auch, die Debug-Informationen für libssh2 mit 'set solib-search-path ' – scorpGoku

Antwort

0

Das "??" Einträge sind wo Symbol Übersetzung fehlgeschlagen. Stack-Walking - was die Stack-Trace erzeugt - kann ebenfalls fehlschlagen. In diesem Fall werden Sie wahrscheinlich einen einzelnen gültigen Rahmen und dann eine kleine Anzahl gefälschter Adressen sehen. Wenn Symbole oder Stapel zu stark beschädigt sind, um den Stack-Trace zu verstehen, gibt es normalerweise Möglichkeiten, dies zu beheben: Installieren von Debug-Info-Paketen (gdb weitere Symbole geben und DWARF-basierte Stack-Stations ausführen) oder Neukompilieren der Software von Quelle mit Rahmenzeigern und Debugging-Informationen (-fno-omit-frame-pointer -g).

1

Um gdb laufen zu lassen und den besten davon Gebrauch zu machen, erstens, müssen Sie Ihre Quelle mit der -g or -ggdb3 Option von gcc auf folgende Weise kompilieren:

gcc -ggdb3 sample.c -o sample 

Danach Sie eine ausführbare Datei bekommen oder binäre Datei, die Sie ausführen können. Nach der Ausführung erzeugt das Programm einen segfault und ein Coredump wird erstellt. Sie können diese Systemdatei ist in der folgenden Art und Weise verwenden, um mit gdb den Backtrace zu erhalten:

gdb ./sample /path/to/core/file 

Sie können sogar Ihr Programm starten gdb verwenden, ohne es tatsächlich separat ausgeführt wird und die Core-Datei explizit zu erzeugen. Führen Sie dazu den folgenden Befehl aus:

gdb ./sample 
+0

danke, tatsächlich habe ich es mit '' CFLAGS + = -g -Wall 'gemacht . – ccw

+0

Ja das ist der Weg zu gehen, während Sie das Makefile verwenden. Wenn Sie diese Antwort nützlich fanden, akzeptieren Sie bitte die Antwort. – iqstatic