Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与OpenGL、SDL和图形驱动程序相关的内存泄漏和错误_Opengl_Memory Leaks_Segmentation Fault_Sdl_Ati - Fatal编程技术网

与OpenGL、SDL和图形驱动程序相关的内存泄漏和错误

与OpenGL、SDL和图形驱动程序相关的内存泄漏和错误,opengl,memory-leaks,segmentation-fault,sdl,ati,Opengl,Memory Leaks,Segmentation Fault,Sdl,Ati,系统和库规范: 操作系统-Ubuntu 11.10 图形卡-ATI Mobility Radeon HD 5430 图形驱动程序版本-fglrx更新/fglrx更新开发(2:8.881-0ubuntu6.1) SDL版本-libsdl1.2debian-all(SDL 1.2.14-6.1) OpenGL版本-libgl1 mesa(7.7.1-5) ----4.1.11005兼容性配置文件上下文 编译命令:gcc-Wall-Wextra-g-O3-o$@$^-lSDL-lGLU-lGLEW-s

系统和库规范:
操作系统-Ubuntu 11.10
图形卡-ATI Mobility Radeon HD 5430
图形驱动程序版本-fglrx更新/fglrx更新开发(2:8.881-0ubuntu6.1)
SDL版本-libsdl1.2debian-all(SDL 1.2.14-6.1)
OpenGL版本-libgl1 mesa(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/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 file=memerrors.txt./main

我通常不关心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

我的准备工作如下:

    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;
}
int宽=800,高=600;
SDL_曲面*initSDL()
{
const SDL_VideoInfo*视频;
SDL_表面*表面;
//初始化SDL
if(SDL_Init(SDL_Init_EVERYTHING)<0)致命(“视频初始化失败:%s\n”,SDL_GetError());
video=SDL_GetVideoInfo();
if(video==NULL)致命(“视频查询失败:%s\n”,SDL_GetError());
int flags=SDL_OPENGL | SDL_DOUBLEBUF | SDL_调色板;
如果(视频->硬件可用)标志|=SDL硬件表面;
else标志|=SDL|U表面;
如果(视频->blit_hw)标志|=SDL_HWACCEL;
/*设置OpenGL属性*/
if(SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8)<0)致命(“视频属性错误:%s\n”,SDL_GetError());
if(SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8)<0)致命(“视频属性错误:%s\n”,SDL_GetError());
如果(SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8)<0)致命(“视频属性错误:%s\n”,SDL_GetError());
if(SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8)<0)致命(“视频属性错误:%s\n”,SDL_GetError());
if(SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24)<0)致命(“视频属性错误:%s\n”,SDL_GetError());
if(SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1)<0)致命(“双缓冲初始化失败:%s\n”,SDL_GetError());
/*创建曲面*/
表面=SDL_设置视频模式(宽度、高度、32、标志);
if(surface==NULL)致命(“视频模式设置失败:%s\n”,SDL_GetError());
SDL_WM_SetCaption(“Morbular”、“Morbular”);
返回面;
}
void initGL()
{
GLenum err=glewInit();
如果(!err==GLEW_OK)致命(“GLEW Init失败:%s\n”,glewGetErrorString(err));
glClearColor(0.0,0.0,0.0,1.0);
glEnable(GL_CULL_面);
glEnable(GLU深度试验);
errCheck(“initGL()”);
}
int main(int argc,char*argv[])
{
//处理命令行参数
对于(int i=1;iID)
//----代码段
char*textFileRead(char*filename)
{
文件*文件;
char*text=NULL;
int f,计数;
f=打开(文件名,仅限Ordu);
如果(f<0)致命(“无法打开文件%s\n”,文件名);
计数=lseek(f,0,搜索结束);
如果(计数0){
int size=sizeof(char)*(计数+1);
text=(字符*)malloc(大小);
if(text==NULL)致命(“无法为文件读取%s\n、大小、文件名分配%d字节的内存”);
count=fread(text,sizeof(char),count,file);
文本[计数]='\0';
}
fclose(文件);
}else致命(“从文件%s读取数据时出错,\n”,文件名);
}
返回文本;
}
打印信息日志(着色器->ID);
glUseProgramObjectARB(着色器->ID);
//固定制服
自由(顶点字符串);
自由(碎片字符串);
//----代码段

如果你还需要什么,尽管问。请帮助我理解为什么会发生这种情况。

我在工作时通常会看到这样的事情
  • 不要调用库初始化函数。(在我的例子中经常使用glew_init())
  • 在运行时安装了错误的位(x86 vs x64)库(apt中未安装的内容的下载链接错误),尽管这通常会导致链接器错误
  • 在调试模式下编译时,使用运行库而不是开发库。(忘记了apt get安装lib-dev中的dev)

  • 安装一个并查看
    gdb
    是否为您提供了更好的堆栈跟踪。按照链接中的说明进行操作,但似乎没有。存在SDL调试符号的deb版本。我使用alien将SDL网站上的.rmp转换为.deb包并安装了它,但它并没有给我更好的stacktrace。这里有一个strace,如果这可能会有所帮助的话,它是32位(x86)Ubuntu。i386版本的库调用了所有init函数。
        //---- 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