2011-11-04 64 views
3

系统&库Specications:
操作系统 - Ubuntu的11.10
图形卡 - 的ATI Mobility Radeon HD 5430
图形驱动程序版本 - 的fglrx-更新/的fglrx-更新-DEV(2:8.881-0ubuntu6.1)
SDL版本 - libsdl1.2debian-所有(SDL 1.2.14-6.1)
的OpenGL版本 - 填实libgl1台面(7.7.1-5)
- --- 4.1.11005兼容性配置文件上下文
编译命令:gcc -Wall -Wextra -g -O3 -o $ @ $^-lSDL -lGLU -lGLEW -std = gnu99
包含的库“stdlib.h”“stdio.h”“stdarg.h”“string.h” “文件math.h” “SDL/SDL.h” “GL/glew.h”内存泄漏和相关的OpenGL,SDL错误和图形驱动程序

问题描述 我想移动的OpenGL/GLUT应用到一个OpenGL/SDL应用。 GLUT应用程序无误。

在GDB我收到以下分段错误:

Program received signal SIGSEGV, Segmentation fault. 
__GI_getenv (name=0xb7f8af92 "L_MOUSE_RELATIVE") at getenv.c:90 
90 getenv.c: No such file or directory. 
    in getenv.c 
(gdb) where 
#0 __GI_getenv (name=0xb7f8af92 "L_MOUSE_RELATIVE") at getenv.c:90 
#1 0xb7f69922 in ??() from /usr/lib/libSDL-1.2.so.0 
#2 0xb7f69922 in ??() from /usr/lib/libSDL-1.2.so.0 
#3 0xb7f30fa5 in SDL_PumpEvents() from /usr/lib/libSDL-1.2.so.0 
#4 0xb7f30fe4 in SDL_PollEvent() from /usr/lib/libSDL-1.2.so.0 
#5 0x080499df in mainloop (head=0x845f248) at mainloop.c:34 

纵观我的整个程序中,我始终检查NULL和其他失败的回报,所以我决定跑Valgrind的,看看记忆在我的代码使用不当。以下链接至所得的valgrind --log文件的文件= memerrors.txt ./main http://www.2shared.com/document/1dnbZQPS/memerrors-simple.html

我通常不会在意库内存错误的SDL,OpenGL的,或显卡驱动程序( fglrx),但在我自己的代码中几乎没有内存泄漏或错误,所以我很好奇,如果有人有任何想法。

int mainloop(void* head){ 
//Declare Standard Variables 
MORB_Header* header = (MORB_Header*) head; 
MORB_Renderer* render = header->render; 
MORB_Light* light = render->light; 

//Initialize Shader 
GLShader* shader = glCreateShaders(header,"shader.vert","shader.frag"); 

//Load Textures for Use 
texture[0] = glLoadTexture("rock.bmp"); 
texture[1] = glLoadTexture("rock_n.bmp"); 

//First Run Setup 
header->scrUpd = 1; 
glViewport(0,0, render->width,render->height); 
//Check for Errors 
GLenum errb = glGetError(); 
glProject(render->fov,render->aspect,render->zNear,render->zFar); 
errCheck("First Run Setup"); 

int morbexit = 0; 
while(!morbexit) 
{ 
    SDL_Event event; 
    while(SDL_PollEvent(&event)) 
    { 
       //Do Nothing 
    } 
    if(header->scrUpd){ 
      /* Working Display Function */ 
     } 
    else SDL_Delay(5); 
    morbexit = header->quit; 
} 
free(shader); 
return 0; 
} 

如果我删除事件循环,我没有收到使我认为内存问题主要在SDL中的分段错误。

我准备功能如下:与内存/的OpenGL/SDL

//---- Code segement 
int size = sizeof(Header)+sizeof(Renderer)+sizeof(Light); 
void* addr = malloc(size); 
if (addr == NULL) fatal("Cannot allocate %d bytes of memory for Header file %s\n",size,stderr); 
Header* header = (Header*) addr; 
    //---- Code segement (following sets all attributes of header,render,etc) 

    //---- Code segement 
int size = sizeof(GLShader); 
GLShader* shader = malloc(size); 
if (shader == NULL) fatal("Cannot allocate %d bytes of memory for Shader Program %s\n",size,stderr); 
    //---- Code segement 

    //---- Code segement 
glValidateProgramARB(shader->ID) 

    //---- Code segement 
    char* textFileRead(char *filename) 
    { 
FILE *file; 
char *text = NULL; 

int f,count; 
f = open(filename, O_RDONLY); 
if (f < 0) fatal("Cannot open file %s\n",filename); 

count = lseek(f, 0, SEEK_END); 
if(count<0) fatal("Error reading data from file %s\n",filename); 

close(f); 

if (filename != NULL) { 
    file = fopen(filename,"rt"); 
    if (file != NULL) { 
     if (count > 0) { 
      int size = sizeof(char)*(count+1); 
      text = (char *)malloc(size); 
      if(text==NULL) fatal("Cannot allocate %d bytes of memory for file read %s\n",size,filename); 
      count = fread(text,sizeof(char),count,file); 
      text[count] = '\0'; 
     } 
     fclose(file); 
    } else fatal("Error reading data from file %s\n",filename); 
} 
return text; 
} 

printInfoLog(shader->ID); 

glUseProgramObjectARB(shader->ID); 
    //Set uniforms   

free(vertexString); 
free(fragmentString); 
    //---- Code segement 

处理如果您需要什么就问代码

int width=800, height=600; 
    SDL_Surface* initSDL() 
{ 
const SDL_VideoInfo* video; 
SDL_Surface* surface; 

//Initialize SDL 
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) fatal("Video Init failed: %s\n",SDL_GetError()); 

video = SDL_GetVideoInfo(); 
if (video == NULL) fatal("Video query failed: %s\n",SDL_GetError()); 

int flags = SDL_OPENGL | SDL_DOUBLEBUF | SDL_HWPALETTE; 
if (video->hw_available) flags |= SDL_HWSURFACE; 
else flags |= SDL_SWSURFACE; 
if (video->blit_hw) flags |= SDL_HWACCEL; 

/* Sets up OpenGL Attributes */ 
if(SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8) < 0) fatal("Video Attribute error: %s\n", SDL_GetError()); 
if(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8) < 0) fatal("Video Attribute error: %s\n", SDL_GetError()); 
if(SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8) < 0) fatal("Video Attribute error: %s\n", SDL_GetError()); 
if(SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8) < 0) fatal("Video Attribute error: %s\n", SDL_GetError()); 
if(SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24) < 0) fatal("Video Attribute error: %s\n", SDL_GetError()); 
if(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1) < 0) fatal("Double Buffering Init failed: %s\n", SDL_GetError()); 

/* Create the surface */ 
surface = SDL_SetVideoMode(width,height,32,flags); 
if (surface==NULL) fatal("Video Mode Set failed: %s\n",SDL_GetError()); 
SDL_WM_SetCaption("Morbular","Morbular"); 

return surface; 
} 
void initGL() 
{ 
GLenum err = glewInit(); 
if(!err == GLEW_OK) fatal("Glew Init failed: %s\n",glewGetErrorString(err)); 
glClearColor(0.0,0.0,0.0,1.0); 
glEnable(GL_CULL_FACE); 
glEnable(GL_DEPTH_TEST); 
errCheck("initGL()"); 
} 
int main(int argc, char* argv[]) 
{ 
//Process command line arguments 
for(int i=1; i<argc; i++) { 
    if(!strcmp(argv[i],"-window")) { 
     width = atoi(argv[++i]); 
     height = atoi(argv[++i]); 
     if(!(width && height)) { 
      fatal("'-window' should be in the form '-window WIDTH HEIGHT'"); 
     } 
    } else { 
     printf("Argument %s is invalid... ignored...", argv[i]); 
    } 
} 

SDL_Surface* surface; 
Header* header; 

surface = initSDL(); 
initGL(); 

//Start Morbular 
header = headerInit(surface); 
mainloop(header); 

//Cleanup on exit 
SDL_Quit(); 

//Return 
return EXIT_SUCCESS; 
} 

等部位。请帮我理解为什么会发生这种情况。

+3

安装[SDL的调试版本](https://wiki.ubuntu.com/DebuggingProgramCrash)并查看'gdb'是否为您提供更好的堆栈跟踪。 – genpfault

+0

按照链接中的说明进行操作,但似乎没有.deb版本的SDL调试符号。我使用外星人将SDL在其网站上的.rmp文件转换为.deb软件包并安装了它,但它并没有给我提供更好的堆栈跟踪。 – Rafiki

+1

这是一个strace,如果这可能会有所帮助,http://www.2shared.com/file/wokZ1jgD/strace-main.html – Rafiki

回答

1

我通常看到这样的事情时,我

  • 不调用库初始化函数。(glew_init()经常在我的情况)
  • 有错误的位数(86 VS 64)在运行库(错误的下载链接不适用于某些东西)虽然通常这会导致链接器错误
  • 在调试模式下编译时有运行时而不是开发库。 (忘记在apt-get安装lib-awesome-dev)
  • +0

    32位(x86)Ubuntu。 i386版本的库调用了所有初始化函数。 – Rafiki