Segmentation Fault
-
Also, ich habe noch nicht wirklich viel Ahnung von C++ und sitze jetzt das erste Mal vor einem Segmentation Fault.
Es geht darum, ein File einzulesen. Letztendlich sollen es zwei mögliche Funktionalitäten werden, deswegen wird die if-Abfrage so gestellt.
Ich habe den Code mal auf den minimalen Fall, in dem ich den Segmentation Fault noch bekomme, runtergebrochen (auf gut Deutsch: momentan tut der Code nichts sinnvolles!)
Was ich sehr merkwürdig finde: der Fehler kommt noch bevor die Zeile mit der if-Abfrage ausgeführt wird. Deswegen bin ich gerade am verzweifeln, weil ich somit auch nicht wirklich debuggen kann.hier der code:
#include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { if (argc == 5 && strcmp(argv[1], "bas") == 0) { ifstream inFile; inFile.open(argv[2], ios::in); if (!inFile.good()) { cerr << "Couldn't open inFile " << argv[2] <<"!"<< endl; return -1; } int sidelength = atoi(argv[3]); if (1000000 % sidelength != 0) { cerr << "Sidelength has to be a factor of 1000000!"; return -1; } ofstream outFile; outFile.open(argv[4]); if (!outFile.good()) { cerr << "Couldn't open outFile " << argv[4] << "!" << endl; return -1; } char* pos; char* data; int x, y; int types[1000][1000]; double alleleFreqs[1000][1000]; inFile.close(); outFile.close(); } else { cerr << "usage:\tantsimulation_auswertung [bas] [bas-file] [side length of parts (int)]\n" "\t[outFile]"<< endl; return -1; } return 0; }Ich habe mal strace damit laufen lassen, hier der Output (der mir leider nicht wirklich viel sagt und der sich auch nicht in eine besser lesbare Form bringen lassen will):
execve("./antsimulationToR", ["./antsimulationToR", "bas", "/home/rebecca/bachelorarbeit/ant"..., "100", "/home/rebecca/bachelorarbeit/ant"...], [/* 35 vars */]) = 0
brk(0) = 0x602000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e38c5f000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e38c5d000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=128996, ...}) = 0
mmap(NULL, 128996, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5e38c3d000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@I\5\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1014808, ...}) = 0
mmap(NULL, 3186696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5e38738000
mprotect(0x7f5e38827000, 2097152, PROT_NONE) = 0
mmap(0x7f5e38a27000, 36864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xef000) = 0x7f5e38a27000
mmap(0x7f5e38a30000, 73736, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5e38a30000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libm.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260>\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=526560, ...}) = 0
mmap(NULL, 2621672, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5e384b7000
mprotect(0x7f5e38537000, 2093056, PROT_NONE) = 0
mmap(0x7f5e38736000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7f000) = 0x7f5e38736000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libgcc_s.so.1", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240!\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=56072, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e38c3c000
mmap(NULL, 2151816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5e382a9000
mprotect(0x7f5e382b6000, 2097152, PROT_NONE) = 0
mmap(0x7f5e384b6000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xd000) = 0x7f5e384b6000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\342"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1436976, ...}) = 0
mmap(NULL, 3543672, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f5e37f47000
mprotect(0x7f5e3809f000, 2097152, PROT_NONE) = 0
mmap(0x7f5e3829f000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x158000) = 0x7f5e3829f000
mmap(0x7f5e382a4000, 17016, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f5e382a4000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e38c3b000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e38c3a000
arch_prctl(ARCH_SET_FS, 0x7f5e38c3a6f0) = 0
mprotect(0x7f5e3829f000, 12288, PROT_READ) = 0
mprotect(0x7f5e38a27000, 24576, PROT_READ) = 0
munmap(0x7f5e38c3d000, 128996) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Process 8445 detachedWenn mir irgendjemand helfen könnte (oder auch nur eine Idee hätte, wie ich weitersuchen kann) wäre ich wirklich glücklich!
-
Ich rate mal (auch wenn es nicht dein erster Fehler sein mag, so ist es der erste Fehler den ich gerade sehe): Die Arrays in Zeilen 33, 34 sind viel zu groß für den Stack. Benutz vernünftige Datenstrukturen wie std::vector, dann hast du solche Probleme nicht.
-
vor dem if:
int main(int argc, char* argv[]) { argc == 5 && argv[1]; }erzeugt also auch eine zugriffsverletzung?
oder meintest du ein anderes if?bb
edit: ok, seppj sollte schon die richtige antwort gegeben haben^^
-
JUHUUUU!
Das ersetzen der Arrays durch Vectoren hat das Problem gelöst. Es war so klar, dass es irgendwas ganz simples ist.
Vielen, vielen Dank für die schnelle Hilfe.