[Gelöst (siehe unten)] Speicherzugriffsfehler bei string Initialisierung



  • Hallo,

    erster Beitrag und C++-Neuling, hoffe ich mache formell alles richtig :-).
    Folgender kleiner Hilferuf:

    int main(int argc, char* argv[]) {
    	// *** std::string kopfzeile( "Kapitel 1" );
    	// std::cout << kopfzeile << std::endl;
    	Initialize(argc, argv);
    	InitWindow( TITLE );
    	glutMainLoop();
    	exit(EXIT_SUCCESS);
    }
    

    Ich weiß, eigentlich ist das C und kein C++. Das Programm läuft so auch prima, Wenn ich aber die Zeile mit den drei Sternchen mit aufnehme gibt's einen Speicherzugriffsfehler. GDB hilft nicht weiter, vermutlich weil mir von irgendeiner Bibliothek die Debug-Symbole fehlen.

    Neben den OpenGL-libs glew, gl und freeglut lade ich noch string und cstdlib. Eclipse ist meine IDE, aber auch von der Kommandozeile kompiliert stürzt die Sache ab.

    Irgendjemand eine Idee ?

    Beste Grüße



  • Was ist Initialize, InitWindow, TITLE?
    Was steht in argc, argv?
    Linux?



  • Hi,

    argc, argv sind in dem Falle standard nach Programmaufruf, also nur der Programmname. Sollen auch exact so nach Doku von OpenGL weitergegeben werden. Da könnten Dinge rein wie "-gldebug" oder "-nosync" o. ä.

    TITLE ist eine Zeichenkette #define'd (das will ich ja loswerden mit dem string), Die beiden Funktionen initielisieren gl und glut und machen dann ein Grafik-Fenster auf, das klappt auch alles.

    Ja, Linux, g++ 4.9.2.

    Es ist diese eine Zeile die den Unterschied und mich nachdenklich macht ...

    ??



  • Warum zeigst du nicht den kompletten Code? Können ja eigentlich höchstens 5 Zeilen mehr sein.



  • Edit: Ich hab's ! Aus einem OpenGL-Form: dem Compiler -pthread und dem Linker -lpthread mitgeben und es tut.
    🙂

    Wollte euch nicht zumüllen. Das ist der komplette Code:

    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include <GL/glew.h>
    #include <GL/freeglut.h>
    
    #define TITLE "Chapter 1"
    
    int CurrentWidth = 800,
    	CurrentHeight = 600,
    	WindowHandle = 0;
    
    void Initialize(int, char*[]);
    void InitWindow( const char* );
    void ResizeFunction(int, int);
    void RenderFunction(void);
    
    int main(int argc, char* argv[]) {
    	// std::string kopfzeile( "Kapitel 1" );
    	// std::cout << kopfzeile << std::endl;
    	Initialize(argc, argv);
    	InitWindow( TITLE );
    	// std::string Kopf( "Fuß !" );
    	glutMainLoop();
    	exit(EXIT_SUCCESS);
    }
    
    void Initialize(int argc, char* argv[]) {
    	glutInit(&argc, argv);
    	// glutInitContextVersion(4, 0);
    	// glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);
    	// glutInitContextProfile(GLUT_CORE_PROFILE);
    	glutSetOption( GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS );
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    }
    
    void InitWindow( const char* t ) {
        glutInitWindowSize(CurrentWidth, CurrentHeight);
        WindowHandle = glutCreateWindow(t);
        if(WindowHandle < 1) exit(EXIT_FAILURE);
        glutReshapeFunc(ResizeFunction);
        glutDisplayFunc(RenderFunction);
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    }
    
    void ResizeFunction(int Width, int Height) {
    	CurrentWidth = Width;
    	CurrentHeight = Height;
    	glViewport(0, 0, CurrentWidth, CurrentHeight);
    }
    
    void RenderFunction(void) {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glutSwapBuffers();
    	glutPostRedisplay();
    }
    

    Es ist ein Beispiel aus einem OpenGL-Tutorial. Wollte die beiden Init-Funktionen in ein Singleton umbauen, erste Schritte sozusagen 🙂

    Dem Linker gab ich -lGL -lGLEW -lglut auf den Weg.

    Jetzt hab ich die ganze Sache mal runtereduziert:

    // #include <cstdlib>
    #include <string>
    #include <iostream>
    
    int main( int argc, char* argv[] ) {
    	std::string kopfzeile( "Kapitel 1" );
    	std::cout << "Test" << std::endl;
    	return 0;
    }
    

    Das stürzt ab.

    Mit auskommentierter erster Zeile nicht. Wenn ich die o. g. OpenGL-Bibliotheken nicht dazulinke läuft es. Ich denke ich muß in OpenGL-Foren weitersuchen ...



  • GreenBaron schrieb:

    Dem Linker gab ich -lGL -lGLEW -lglut auf den Weg.

    Jetzt hab ich die ganze Sache mal runtereduziert:

    // #include <cstdlib>
    #include <string>
    #include <iostream>
    
    int main( int argc, char* argv[] ) {
    	std::string kopfzeile( "Kapitel 1" );
    	std::cout << "Test" << std::endl;
    	return 0;
    }
    

    Das stürzt ab.

    Mit auskommentierter erster Zeile nicht. Wenn ich die o. g. OpenGL-Bibliotheken nicht dazulinke läuft es. Ich denke ich muß in OpenGL-Foren weitersuchen ...

    Soweit ich weiß verwirft der Linker eine library, wenn von dieser keinerlei methoden im programm verwendet werden.
    Wenn ich recht habe, dann kann es nicht am dazu linken von ungenützten libs zum crash führen.

    Kannst du mal die ausgabe

    ldd <binary>
    

    von deinem reduzierten beispiel hier posten?

    Edit: ok ich lag falsch. Der linker fügt auch ungenutzte libraries dem programm als abhängigkeit hinzu.
    Das kann man verhindern, wenn man vor der angabe der libs, welche dazu gelinkt werden soll den linker paramerter "--as-needed" hinzufügt.

    gcc test.cpp  -Wl,--as-needed  -lGL -lGLEW -lglut
    

    Dann scheint bei dir irgendetwas mit der OpenGL lib (libGL) oder GLEW/glut "kaputt" zu sein.
    Denn bei mir stützt das minimal beispiel nicht ab, wenn ich es wie folgt übersetze:

    gcc test.cpp  -lGL -lGLEW -lglut
    


  • Hallo firefly,

    hier die ldd-Ausgabe:

    linux-vdso.so.1 (0x00007fff81f11000)
    	libglut.so.3 => /usr/lib/x86_64-linux-gnu/libglut.so.3 (0x00007f5aefb68000)
    	libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f5aef81c000)
    	libGLEW.so.1.10 => /usr/lib/x86_64-linux-gnu/libGLEW.so.1.10 (0x00007f5aef590000)
    	libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5aef285000)
    	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5aeef84000)
    	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5aeed6e000)
    	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5aee9c3000)
    	libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f5aee7b1000)
    	libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f5aee46e000)
    	libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f5aee25e000)
    	libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f5aee058000)
    	libnvidia-tls.so.340.96 => /usr/lib/x86_64-linux-gnu/tls/libnvidia-tls.so.340.96 (0x00007f5aede55000)
    	libnvidia-glcore.so.340.96 => /usr/lib/x86_64-linux-gnu/libnvidia-glcore.so.340.96 (0x00007f5aeb241000)
    	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5aeb03d000)
    	libXmu.so.6 => /usr/lib/x86_64-linux-gnu/libXmu.so.6 (0x00007f5aeae24000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007f5aefdb3000)
    	libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f5aeac02000)
    	libXt.so.6 => /usr/lib/x86_64-linux-gnu/libXt.so.6 (0x00007f5aea999000)
    	libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f5aea795000)
    	libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f5aea590000)
    	libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007f5aea388000)
    	libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f5aea16b000)
    	libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f5ae9f66000)
    

    Durch Zugabe von -pthread und -lpthread tut's. Hätte wohl das multithreading Kapitel doch nicht überspringen sollen 🙂

    Aber eins nach dem anderen, zuerst mal geht es. Was da genau schief ging werde ich sicher in der Zukunft noch verstehen.

    Jedenfalls mal danke so weit !


Log in to reply