GLEW 1.10.0分段故障

GLEW 1.10.0 Segmentation Fault

本文关键字:分段 故障 GLEW      更新时间:2023-10-16

为什么使用GLEW 1.10.0时出现分段错误?(我在问题的底部提供了我的系统的详细信息。)

我下载并编译了GLEW。编译(make-all)和安装(sudomakeinstall.all)工作正常,没有显示任何错误。GLEW库安装在/usr/lib64/libGLEW.so.1.10.0中。

我创建了一个简单的OpenGL测试程序(见下文),该程序使用GLEW和glfw3(3.0.3)。当该程序使用已安装的GLEW-lib时,会发生分段错误。当我在测试程序中使用GLEW源代码时,程序就可以工作了。

但是,如果我加载着色器,然后使用glGetProgramInterfaceiv查询编译的OpenGL程序,我会再次出现分段错误。


详细信息:

出现分段故障

  1. 运行glewinfo
  2. 运行visualinfo
  3. 测试程序(详细信息如下)
  4. 调用glGetProgramInterfaceiv(详细信息如下)

使用gdb 的glewinfo堆栈跟踪

#0  0x00007ffff6d5fca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff51b32f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
#2  0x00007ffff7557c92 in ?? () from /usr/lib64/libGL.so.1
#3  0x00007ffff7553ea1 in ?? () from /usr/lib64/libGL.so.1
#4  0x00007ffff75540ce in glXChooseVisual () from /usr/lib64/libGL.so.1
#5  0x0000000000454883 in glewCreateContext ()
#6  0x000000000043b224 in main ()

使用gdb 的可视化信息堆栈跟踪

#0  0x00007ffff6d5fca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff51b32f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
#2  0x00007ffff7557c92 in ?? () from /usr/lib64/libGL.so.1
#3  0x00007ffff7553ea1 in ?? () from /usr/lib64/libGL.so.1
#4  0x00007ffff75540ce in glXChooseVisual () from /usr/lib64/libGL.so.1
#5  0x000000000040237b in CreateContext ()
#6  0x000000000040103e in main ()

以下是使用已安装的GLEW库和glfw3(3.0.3)的测试程序

#include <GL/glew.h> 
#include <GLFW/glfw3.h> 
int main()
{
glfwInit();
GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL,
NULL);
glfwMakeContextCurrent(window);
glewInit();
glfwTerminate();
}

编译:

g++ -o "Basic" "main.cpp" -lglfw3 -lGLEW -lGL -lX11 -lrt -lXxf86vm -lXrandr

跑步前/基本I设置

export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64

(否则找不到驻留在/usr/lib64中的GLEW-lib)

程序出现分段错误。如果我通过eclipse或使用gdb运行程序,堆栈跟踪为:

Thread [1] 16728 [core: 2] (Suspended : Signal : SIGSEGV:Segmentation fault)    
0x7ffff65e5ca0  
__driCreateNewScreen_20050727() at 0x7ffff3de52f6   
0x7ffff7645c92  
glXQueryVersion() at 0x7ffff763d0aa 
_glfwInitContextAPI() at 0x40c580   
_glfwPlatformInit() at 0x408855 
glfwInit() at 0x404829  
main() at main.cpp:7 0x403819   

使用gdb提供回溯

#0  0x00007ffff65e5ca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff3de52f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
#2  0x00007ffff7980c92 in ?? () from /usr/lib64/libGL.so.1
#3  0x00007ffff79780aa in glXQueryVersion () from /usr/lib64/libGL.so.1
#4  0x000000000040c580 in _glfwInitContextAPI ()
#5  0x0000000000408855 in _glfwPlatformInit ()
#6  0x0000000000404829 in glfwInit ()
#7  0x0000000000403819 in main ()

当不使用GLEW库而使用源代码(GLEW.h和GLEW.c)时,程序可以工作。为了实现这一点,我将第一个include更改为

#include <glew.h>

当这次链接时,我使用图书馆Xi(-lXi)。编译和链接程序的g++命令有:

g++ -I"./" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "main.cpp"
g++ -I"./" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"glew.d" -MT"glew.d" -o "glew.o" "glew.c"
g++ -o Basic ./glew.o ./main.o -lGL -lX11 -lXrandr -lXxf86vm -lrt -lglfw3 -lXi

跑步前/基本I设置

export LD_LIBRARY_PATH=/usr/local/lib

(否则我会遇到分段错误,因为它试图使用已安装的GLEW-lib)这个程序不会抛出分段错误。该程序还使用eclipse运行。


调用glGetProgramInterfaceiv(程序、GL_program_OUTPUT、GL_ACTIVE_REOURCES和输出)时的详细信息;

在上面的测试程序中,我添加了加载顶点和片段着色器的代码。我把着色器编译成一个程序。这一切都有效。调用glGetShaderInfoLog可以工作并打印日志。当我添加一行调用glGetProgramInterfaceiv的代码时,程序会出现分段错误。使用glewExperimental=GL_TRUE;没有帮助。

当使用gdb时,我无法获得一个像样的堆栈跟踪。这就是gdb给出的:

(gdb) backtrace
#0  0x0000000000000000 in ?? ()
#1  0x000000000042ec18 in main () at ../main.cpp:54

OS详细信息:

  • Linux:3.2.0-4-amd64
  • Distro:Debian 7.3 Wheezy
  • uname-m:x86_64
  • /proc/cpuinfo->flags参数->lm值存在

编译器详细信息

  • g++——版本:g++(Debian 4.7.2-5)4.7.2

OpenGL详细信息:

  • OpenGL提供程序:Advanced Micro Devices(来自AMD Catalyst Control Center)
  • OpenGL渲染器:AMD Radeon HD 7600M系列(来自AMD Catalyst Control Center)
  • OpenGL版本:4.2.11762兼容性配置文件上下文(来自AMD Catalyst Control Center)
  • glxinfo:
  • 服务器glx版本字符串:1.4
  • 客户端glx版本字符串:1.4
  • GLX版本:1.4
  • OpenGL版本字符串:4.2.11762兼容性配置文件上下文
  • OpenGL着色语言版本字符串:4.20
  • 服务器glx供应商字符串:ATI
  • 客户端glx供应商字符串:ATI

测试程序中使用的库的详细信息--lglfw/usr/local/lib/libglfw3.a 3.0.3

  • -lGL在我的系统libGL.so.1.2->/usr/lib64/fglrx/fglrx-libGL.so.1.2和libGL.so.1.2->/usr/lib/i386 linux gnu/fglrx/fglrx libGL.so.1.2

  • -lX11/usr/lib/x86_64-linux-gnu/libX11.so.6.3.0

  • -lrt/usr/lib/x86_64-linux-gnu/libt.so->/lib/x86_64-linux-gnu/libt-so.1->/lib/x86_64-linux-gnu/libst-2.13.so

  • -lXandr/usr/lib/x86_64-linux-gnu/libXandr.so.2->libXandr.so.2.2.0

  • -lXxf86vm/usr/lib/x86_64-linux-gnu/libXxf86vm.so.1->libXxf86vm.so.1.0.0

  • -lXi/usr/lib/x86_64-linux-gnu/libXi.so.6->libXi.so.6.1.0

我的直觉:原因是纯64位库和32位库之间的混淆。

关于:分段故障

如果

  1. 将libGLEW从/usr/lib64中移出(例如,移动到/tmp文件夹中),然后
  2. 则例如导出LD_LIBRARY_PATH=/tmp(而不是导出LD_LBRARY_PATH=/usr/lib64)

然后分段故障消失(测试程序运行,glewinfo和visualinfo工作)

/usr/lib64中的某些内容导致了此问题。

我看到了这个页面AMD 13.1 64位驱动程序和libGL.so.1错误,它解释了AMD安装程序将libGL.so文件放在哪里

安装程序将lib文件放在/usr/lib64中。但是,如果您有Ubuntu,那么64位库位于/usr/lib中。我做了以下操作来解决我的问题。

卸载驱动程序sudo/amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run--卸载

删除/usr/lib64文件夹sudo rm-Rf/usr/lib64

创建指向/lib/usr的符号链接/usr/lib64sudo ln-s/usr/lib/usr/lib64

重新安装驱动程序sudo/amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run--强制

重新启动sudo重新启动

我不确定这个符号链接是否是个好主意。。。


关于:glGetProgramInterfaceiv(GLAPI/glGetProgramInterface)

失败,因为它只能从OpenGL>=4.3中获得。我的卡是4.2。运行glewinfo还揭示了这一点:

GL_ARB_program_interface_query:                                MISSING 
-------------------------------
glGetProgramInterfaceiv:                                     MISSING
glGetProgramResourceIndex:                                   MISSING
glGetProgramResourceLocation:                                MISSING
glGetProgramResourceLocationIndex:                           MISSING
glGetProgramResourceName:                                    MISSING
glGetProgramResourceiv:                                      MISSING