当前位置: 首页 > 知识库问答 >
问题:

GLEW 1.10.0分段故障

通和裕
2023-03-14

分段错误发生在

  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实现visualinfo的堆栈跟踪

#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
export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64
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   
#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 ()
#include <glew.h>
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

运行前。/basic I设置

export LD_LIBRARY_PATH=/usr/local/lib

(否则我会得到分段错误,因为它试图使用安装的GLEW库)这个程序不会抛出分段错误。该程序也使用Eclipse运行。

调用glGetProgramInterfaceiv时的详细信息(program,GL_PROGRAM_OUTPUT,GL_ACTIVE_RESOURCES,&outputs)

在上面的测试程序中,我添加了加载顶点和片段着色器的代码。我把着色器编译成一个程序。这都管用。调用glGetShaderInfoLog可以工作并打印日志。当我添加一行调用glGetProgramInterfaceiv的代码时,程序会给出一个分段错误。使用GlewEstabulator=GL_true;也无济于事。

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

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

操作系统详细信息:

    null
    null
  • OpenGL提供程序:高级微设备(来自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.A3.0.3

>

  • -lgl我的系统上有2个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

    -lrt/usr/lib/x86_64-linux-gnu/librt.so->/lib/x86_64-linux-gnu/librt.so.1->/lib/x86_64-linux-gnu/librt.so.1->/lib/x86_64-linux-gnu/librt-2.13.so

    -lxrandr/usr/lib/x86_64-linux-gnu/libxrandr.so.2->libxrandr.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

  • 共有1个答案

    阙弘博
    2023-03-14

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

    涉及:分段故障

    如果

    1. 将libGLEW移出/usr/lib64(例如移入/tmp文件夹)并
    2. 然后例如导出ld_library_path=/tmp(而不是导出ld_library_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

    创建一个符号链接/usr/lib64,它指向/lib/usr sudo ln-s/usr/lib/usr/lib64

    我不确定那个象征性的链接是不是个好主意...

    涉及: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
    
     类似资料:
    • 问题内容: 我有一个用于捕获任何分段错误或ctrl- c的应用程序。使用下面的代码,我能够捕获分段错误,但是该处理程序一次又一次地被调用。我该如何阻止他们。供您参考,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? 处理程序就是这样。 在这里,对于Segmentation故障信号,处理程序被多次调用,并且很明显MyfreeBuffers()给我释放已释放的内存的错误。我只想释放一

    • 我有一个便宜的5美元/月的服务器,1G内存为我的网站处理一些图像。在将GIF图像写入磁盘时,我很少会遇到PHP Imagick的分割错误。 我在console命令上设置了一个内存限制,希望PHP能够首先捕获这个问题,并抛出一个我可以正确处理的异常,但这不起作用。 特别的问题是某些GIF图像会导致它在这行代码中崩溃: 特定的GIF是与成人相关的GIF,因此我不确定是否可以共享它。 以下是我的服务器日

    • 我有一个应用程序,我用它来捕捉任何分割错误或ctrl-c。使用下面的代码,我能够捕获分段错误,但是处理程序被一次又一次地调用。我怎样才能阻止他们。告诉你,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? handler是这样的。 这里的分段故障信号,处理程序被多次调用,因为明显的MyFreeBuffers()给我释放已经释放的内存的错误。我只想免费一次,但仍然不想退出应用程序。

    • 我正在尝试用Objective-C编写一个波阵面OBJ文件查看器,它能够从文件中加载网格/材质/着色器。我已经为着色器和着色器程序创建了类,我正在尝试创建一个OpenGL着色器程序对象,作为着色器程序类的init方法的一部分: 但是,调用glCreateProgram会导致EXC_BAD_访问,调用[SRShader compile]也会导致EXC_BAD_访问,而[SRShader compil

    • 我有.jar文件,该文件在运行时读取一个我使用 GCC 编译器在 OSX 中编译的 .dylib 库。 应用程序在OSX 10.6.8上运行没有任何问题。 Java版本: java版本“1 . 6 . 0 _ 33”Java(TM)SE运行时环境(内部版本1 . 6 . 0 _ 33-b10-424-10m 3720)Java HotSpot(TM)64位服务器虚拟机(内部版本20.8-b01-4