JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=52fb3066f99d2e4577cfb26c3a4a9ffbMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

SDL-Anwendung bringt Fehler bei Beendigung des Spiels

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dragon
Super JLI'ler


Alter: 37
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 15:22    Titel: SDL-Anwendung bringt Fehler bei Beendigung des Spiels Antworten mit Zitat

Hallo,

ich bin dabei ein kleines platformunabhängiges Spiel zu entwickeln und benutze dafür ein paar offene Bibliotheken wie SDL, OpenAL, OpenIL, OpenGL. Die initialisierung von allen komponenten funktioniert ohne Probleme, leider bringt mir SDL immer eine Fehlermeldung, wenn ich mein Spiel beenden möchte. Also immer dann wenn ich das Fenster schließe. Die Fehlermeldung variiert manchmal etwas.

Code:
Fatal signal: Segmentation Fault (SDL Parachute Deployed)

manchmal auch das:
Code:
*** glibc detected *** ./bin_linux/shooter: double free or corruption (out): 0xbf950ef8 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7b0f911]
/lib/libc.so.6(__libc_free+0x84)[0xb7b10f84]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7caee51]
./bin_linux/shooter[0x804ae98]
./bin_linux/shooter(__gxx_personality_v0+0x232)[0x8049fc2]
./bin_linux/shooter[0x804b5a9]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7ac187c]
./bin_linux/shooter(__gxx_personality_v0+0x91)[0x8049e21]
======= Memory map: ========
08048000-0804f000 r-xp 00000000 08:07 20442      /home/sven/projekte/shooter/bin_linux/shooter
0804f000-08050000 rw-p 00007000 08:07 20442      /home/sven/projekte/shooter/bin_linux/shooter
08050000-08294000 rw-p 08050000 00:00 0          [heap]
acb00000-acb21000 rw-p acb00000 00:00 0
acb21000-acc00000 ---p acb21000 00:00 0
acc2a000-acc2b000 ---p acc2a000 00:00 0
acc2b000-ad42b000 rwxp acc2b000 00:00 0
ad42b000-ad4e3000 r-xp 00000000 08:06 36405      /usr/lib/libasound.so.2.0.0
ad4e3000-ad4e8000 rw-p 000b7000 08:06 36405      /usr/lib/libasound.so.2.0.0
ad502000-ad844000 rw-p ad502000 00:00 0
ad844000-ad84d000 rw-p ae420000 00:00 0
ad84d000-ad872000 rw-p ad84d000 00:00 0
ad872000-add72000 rw-s 0000a000 00:0e 8574       /dev/dri/card0
add72000-ae272000 rw-s 00009000 00:0e 8574       /dev/dri/card0
ae272000-ae3d7000 rw-p ae272000 00:00 0
ae3d7000-ae3dc000 rw-s 00000000 00:0e 4859       /dev/snd/pcmC0D0p
ae3dc000-ae3dd000 rw-s 81000000 00:0e 4859       /dev/snd/pcmC0D0p
ae3dd000-ae41d000 rw-p ae3dd000 00:00 0
ae41d000-ae420000 rw-s 002b6000 00:0e 8574       /dev/dri/card0
ae420000-ae421000 r--s 80000000 00:0e 4859       /dev/snd/pcmC0D0p
ae421000-ae424000 r-xp 00000000 08:06 32786      /lib/libresmgr.so.1.0.0
ae424000-ae425000 rw-p 00002000 08:06 32786      /lib/libresmgr.so.1.0.0
ae425000-ae466000 rw-p ae425000 00:00 0
ae466000-ae5a6000 rw-s 002b3000 00:0e 8574       /dev/dri/card0
ae5a6000-ae5a7000 rw-p ae5a6000 00:00 0
ae5a7000-aebe7000 rw-s 00007000 00:0e 8574       /dev/dri/card0
aebe7000-aece7000 rw-s 00006000 00:0e 8574       /dev/dri/card0
aece7000-b6ce7000 rw-s 00003000 00:0e 8574       /dev/dri/card0
b6ce7000-b6cee000 r-xp 00000000 08:06 15612      /lib/librt-2.4.so
b6cee000-b6cf0000 rw-p 00006000 08:06 15612      /lib/librt-2.4.so
b6cf0000-b6da4000 r-xp 00000000 08:06 20012      /usr/lib/libstdc++.so.5.0.7
b6da4000-b6da9000 rw-p 000b3000 08:06 20012      /usr/lib/libstdc++.so.5.0.7
b6da9000-b6dae000 rw-p b6da9000 00:00 0
b6dae000-b6daf000 rw-s 00005000 00:0e 8574       /dev/dri/card0
b6daf000-b6dbf000 rw-s 00004000 00:0e 8574       /dev/dri/card0
b6dbf000-b6dc1000 rw-s 00002000 00:0e 8574       /dev/dri/card0
b6dc1000-b6dc8000 rwxp b6dc1000 00:00 0
b6dc8000-b75d5000 r-xp 00000000 08:06 111200     /usr/X11R6/lib/modules/dri/fglrx_dri.so
b75d5000-b761e000 rw-p 0080d000 08:06 111200     /usr/X11R6/lib/modules/dri/fglrx_dri.so
b761e000-b76aa000 rw-p b761e000 00:00 0
b76aa000-b76e5000 r-xp 00000000 08:06 19621      /lib/libncurses.so.5.5
b76e5000-b76f0000 rw-p 0003a000 08:06 19621      /lib/libncurses.so.5.5
b76f0000-b76f1000 rw-p b76f0000 00:00 0
b76f1000-b76f6000 r-xp 00000000 08:06 27457      /usr/lib/libgpm.so.1.19.0
b76f6000-b76f7000 rw-p 00004000 08:06 27457      /usr/lib/libgpm.so.1.19.0
b76f7000-b7780000 r-xp 00000000 08:06 32955      /usr/lib/libslang.so.2.0.5
b7780000-b778f000 rw-p 00089000 08:06 32955      /usr/lib/libslang.so.2.0.5
b778f000-b77ae000 rw-p b778f000 00:00 0
b77ae000-b7823000 r-xp 00000000 08:06 24509      /usr/lib/libGLU.so.1.3.060402
b7823000-b7824000 rw-p 00074000 08:06 24509      /usr/lib/libGLU.so.1.3.060402
b7824000-b7825000 rw-p b7824000 00:00 0
b7825000-b7836000 r-xp 00000000 08:06 20005      /lib/libz.so.1.2.3
b7836000-b7837000 rw-p 00010000 08:06 20005      /lib/libz.so.1.2.3
b7837000-b7862000 r-xp 00000000 08:06 21774      /usr/lib/liblcms.so.1.0.15
b7862000-b7864000 rw-p 0002a000 08:06 21774      /usr/lib/liblcms.so.1.0.15
b7864000-b7866000 rw-p b7864000 00:00 0
b7866000-b78d3000 r-xp 00000000 08:06 24140      /usr/lib/libmng.soAbgebrochen


Hat jemand einen Plan was mir das sagen soll? Ich bin noch neu in Linux. Zu meinem System: OpenSuSE Linux 10.1, Entwicklungsumgebung: CodeBlocks 1.0

Hier noch der Quellcode für die Initialisierung und Shutdowning aller Bibos:

CPP:
// application.cpp

#include "application.h"

#include <cstdlib>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <IL/il.h>
#include <IL/ilut.h>
#include <AL/al.h>
#include <AL/alc.h>
#include <AL/alut.h>

#include <iostream>

#include "video/texturemanager.h"
#include "log.h"

Application::Application() : mRunning(false)
{
}

//////////////////////////////////////////////////////////////////////////

Application::~Application()
{
}

//////////////////////////////////////////////////////////////////////////

bool Application::init(const std::string& title)
{
    logfile << "Anwendung wird initialisiert" << std::endl;

   //////////////////////////////////////////////////////////////////////
   // SDL mit OpenGL-Untersttzung initialisieren ///////////////////////

   SDL_Surface* screen = NULL;

   if(   SDL_Init(SDL_INIT_VIDEO) < 0 )
      return false;

   screen = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE | SDL_OPENGLBLIT);

   if(screen == NULL)
      return false;

   SDL_WM_SetCaption(title.c_str() , NULL);

   logfile << "SDL mit OpenGL initialisiert" << std::endl;

    glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(0.0f, 1024.0f, 768.0f, 0.0f, -1.0f, 1.0f);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();

   //////////////////////////////////////////////////////////////////////
   // DevIL initialisieren //////////////////////////////////////////////

    ilInit();
   ilutRenderer(ILUT_OPENGL);

    logfile << "OpenIL initialisiert" << std::endl;

   //////////////////////////////////////////////////////////////////////
   // OpenAL initialisieren /////////////////////////////////////////////

   // Verbindung zum Standardger� (default) �fnen
   ALCdevice* device = alcOpenDevice(NULL);

   if(device == NULL)
      return false;

   // Contex erstellen
   ALCcontext* context = alcCreateContext(device, NULL);

   if(context == NULL)
      return false;

   // aktuellen Context festlegen
   alcMakeContextCurrent(context);

    logfile << "OpenAL initialisiert" << std::endl;

   //////////////////////////////////////////////////////////////////////
   // Benutzerdefinierte Initialisierungen //////////////////////////////
   if(onInit() == false)
      return false;

   mRunning = true;

   logfile << "Initialisierung erfolgreich abgeschlossen" << std::endl;

   return true;
}

//////////////////////////////////////////////////////////////////////////

void Application::run()
{
   SDL_Event event;

   int last_ticks = SDL_GetTicks();

   while(mRunning)
   {
      int cur_ticks = SDL_GetTicks();

      float fDeltaTime = static_cast<float>(cur_ticks - last_ticks) / 1000.0f;

      last_ticks = cur_ticks;


      while(SDL_PollEvent(&event))
      {
         switch(event.type)
         {
         case SDL_KEYDOWN:
                onKeyEvent(event.key.which, event.key.type == SDL_KEYDOWN);
            break;

         case SDL_MOUSEMOTION:
                onMouseEvent(event.motion.x, event.motion.y);
            break;

         case SDL_MOUSEBUTTONDOWN:
            onButtonEvent(event.button.button, true);
            break;

         case SDL_MOUSEBUTTONUP:
            onMouseEvent(event.button.button, false);
            break;
         case SDL_VIDEORESIZE:
            break;

         case SDL_QUIT:
            mRunning = false;
            break;
         }
      }

      onUpdate(fDeltaTime);

      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();

      onRender(fDeltaTime);

        SDL_GL_SwapBuffers();
   }
}

//////////////////////////////////////////////////////////////////////////

void Application::quit()
{
   SDL_Event quit_evt;
   quit_evt.type = SDL_QUIT;
   SDL_PushEvent(&quit_evt);

   logfile << "Event zum Beenden wurde gesendet" << std::endl;
}

//////////////////////////////////////////////////////////////////////////

void Application::shutdown()
{
    logfile << "Anwendung wird runtergefahren" << std::endl;

   // Benutzer soll Ressourcen freigeben
   onQuit();

   // OpenAL beenden
   ALCcontext* context = alcGetCurrentContext();
   ALCdevice* device = alcGetContextsDevice(context);

   if(context)
   {
        alcMakeContextCurrent(NULL);
       alcDestroyContext(context);
   }

    if(device)
        alcCloseDevice(device);

    if(video::TextureManager::getInstance().getCount())
        video::TextureManager::getInstance().clear();

    logfile << "Alle Texturen werden gelöscht" << std::endl;

   // DevIL runterfahren
   ilShutDown();

   // SDL beenden
   SDL_Quit();
}

//////////////////////////////////////////////////////////////////////////

void Application::setWindowCaption(const std::string& caption)
{
   SDL_WM_SetCaption(caption.c_str(), NULL);
}

_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 16:36    Titel: Antworten mit Zitat

CPP:
#include <GL/gl.h>


Bei Verwendung von OpenGL mit SDL brauchst Du vermutlich anstattdessen:

CPP:
#include <SDL/SDL_opengl.h>


Verwende ich jedenfalls.

Aber ob es allein daran liegt...
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 16:42    Titel: Antworten mit Zitat

Hau mal zwischen SDL_Init(...) und SDL_SetVideoMode(...) noch folgende Zeile rein:

CPP:
atexit(SDL_Quit);

_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 37
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 17:07    Titel: Antworten mit Zitat

Danke für die Antwort. Leider kommt immer ncoh der selber Fehler. Ich glaube ja sogar, dass es gar nicht an SDL liegt. Vieleicht stimmt irgendwas mit der initialsierung von OpenAL oder so nicht.
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dragon
Super JLI'ler


Alter: 37
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 17:54    Titel: Antworten mit Zitat

*ganzfestmitdemkopfaufdentischschlag* Eigentlich ist die Fehlermeldung eindeutig.
Zitat:
double free or corruption

Ich wollte zwei mal den selben Speicher freigeben. Jetzt funktioniert es erstmal Wink
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 19:01    Titel: Antworten mit Zitat

Dragon hat Folgendes geschrieben:
*ganzfestmitdemkopfaufdentischschlag* Eigentlich ist die Fehlermeldung eindeutig.
Zitat:
double free or corruption

Ich wollte zwei mal den selben Speicher freigeben. Jetzt funktioniert es erstmal Wink


Jop, bei
Code:

Fatal signal: Segmentation Fault (SDL Parachute Deployed)


Dachte ich früher auch oft, dass es an SDL lag, bekommst Du aber auch immer bei Speicherlecks, falschen Initialisierungen von andern Programmteilen, etc...
Immer im Hinterkopf behalten.
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum