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 detached

    Wenn mir irgendjemand helfen könnte (oder auch nur eine Idee hätte, wie ich weitersuchen kann) wäre ich wirklich glücklich!


  • Mod

    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.


Anmelden zum Antworten