Program received signal SIGSEGV, Segmentation fault (das Programm läuft von Stapel.)
Bekomme ich diese Fehlermeldung wenn ich das Programm mit gdb. Der Fehler erscheint in dieser Zeile:
long a = thread_fake(); //in file1.c
War ich immer das problem mit der anderen Funktion definiert wurde, in einer separaten Datei, also habe ich es vereinfacht, um eine einfache Funktion, die nur 0 zurück.
Die Funktion wurde definiert als:
long thread_fake(){ //defined in file2.c
return 0;
}
Als @EmployedRussian darauf hingewiesen, es scheint, das Programm läuft von Stapel. Valgrind zeigt die folgenden Fehler:
==14711== 144 bytes in 1 blocks are possibly lost in loss record 17 of 32
==14711== at 0x4025315: calloc (vg_replace_malloc.c:467)
==14711== by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==14711== by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==14711== by 0x40475C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==14711== by 0x8050583: tm_main_startup
==14711== by 0x8048F6B: main (genome.c:201)
==14711== 144 bytes in 1 blocks are possibly lost in loss record 18 of 32
==14711== at 0x4025315: calloc (vg_replace_malloc.c:467)
==14711== by 0x4010CD7: allocate_dtv (dl-tls.c:300)
==14711== by 0x401146B: _dl_allocate_tls (dl-tls.c:464)
==14711== by 0x40475C6: pthread_create@@GLIBC_2.1 (allocatestack.c:570)
==14711== by 0x804DFE3: thread_startup (thread.c:151)
==14711== by 0x8048F73: main (genome.c:203)
Alle threads erstellt werden, Schloss sich einer entsprechenden pthread_join aufrufen. Auch habe ich versucht die sgcheck-tool, aber es funktioniert nicht auf der Plattform'x86-linux'. Bitte helfen Sie.
Die komplette Ausgabe von Befehl bt:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x406e8b70 (LWP 19416)]
sequencer_run (argPtr=0x89fce00) at sequencer.c:251
251 a = thread_fake();
(gdb) bt
#0 sequencer_run (argPtr=0x89fce00) at sequencer.c:251
#1 0x0804e306 in threadWait (argPtr=0x89dc1f4) at ../lib/thread.c:105
#2 0x4003be99 in start_thread (arg=0x406e8b70) at pthread_create.c:304
#3 0x40253cbe in clone () at ../sysdeps/unix/sysv/linux/i386/clone.S:130
- Versucht valgrind?
- Haben Sie die Funktion deklariert, die in Datei1.c oder in einer header-Datei enthalten ist es?
- in einer header-Datei Datei2.h enthalten ist, die von Datei1.c
- linker-Warnungen?
- Nein..
- Kein repro und nichts, was ich sofort sehen, es sei denn, Sie vergessen, um die Funktion zu deklarieren. Es ist etwas, das man weglassen. Schalten Sie alle Warnungen (
gcc -Wall -Wextra -pedantic
) und zeigen uns die ganze Befehlszeile, die Sie verwenden für die Zusammenstellung. - Nein.Kein linker-Warnungen..
- Sie schreiben, dass Sie diese Fehlermeldung erhalten, wenn das Programm läuft mit gdb. Tritt es auf, wenn Sie es außerhalb der gdb?
- Post der kürzeste, vollständige kompilierbare Beispiel, dass Sie, die den Fehler reproduziert.
- Klingt wie könnte ein stack - /memory-Korruption Problem zu beheben, wenn das problem sich bewegt...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den wahrscheinlichen Weg, in diesem Fall könnte eine
SIGSEGV
ist, wenn Ihr Programm ausgeführt hat-stack.Untersuchen tatsächlichen Absturz Unterricht in GDB mit
x/i $pc
.Wenn die Anweisung eine
PUSH
oder eineCALL
, dann meine Vermutung bestätigt.Andere Möglichkeit: du hast kompiliert Ihren code mit Optimierung, und die tatsächliche fehlerhafte Anweisung hat wenig zu tun mit der source-Leitung zugeschrieben.
Update:
Die Lösung ist nicht run out of stack. Ausführen eines GDB
where
Befehl, dann in jedem frame führt zu einem Absturz führeninfo frame
und schauen für Bilder, die übermäßig groß.Nicht zuordnen, zu viele Daten auf dem stack, oder erhöhen Sie Ihren stack-Größe (
ulimit -s
).Ist
Update2:
Gegeben:
die Größe des Rahmens #1 ist
8
(0xffffc250 - 0xffffc248
), Bild #2 ist80
usw.Letzte Aktualisierung:
Es stellte sich heraus, dass meine oben beschriebene Vorgehensweise, Fehler beim Messen der Größe des frame#0, der, wie sich herausstellte ... 61MB! aufgrund der Anwesenheit von humongous lokalen arrays (so wie Grady Spieler richtig erraten).
bt
Befehl.