|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 25.12.2006, 14:22 Titel: SDL-Anwendung bringt Fehler bei Beendigung des Spiels |
|
|
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 |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 25.12.2006, 15:36 Titel: |
|
|
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 |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 25.12.2006, 15:42 Titel: |
|
|
Hau mal zwischen SDL_Init(...) und SDL_SetVideoMode(...) noch folgende Zeile rein:
_________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
|
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 25.12.2006, 16:07 Titel: |
|
|
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 |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 25.12.2006, 16:54 Titel: |
|
|
*ganzfestmitdemkopfaufdentischschlag* Eigentlich ist die Fehlermeldung eindeutig.
Zitat: | double free or corruption |
Ich wollte zwei mal den selben Speicher freigeben. Jetzt funktioniert es erstmal _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
magynhard Super JLI'ler
Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 25.12.2006, 18:01 Titel: |
|
|
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 |
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 |
|
|
|
|
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
|