【问题标题】:Simple OpenGL code always causes a segmentation fault (C++ on Ubuntu, virtual machine)简单的 OpenGL 代码总是会导致分段错误(Ubuntu 上的 C++,虚拟机)
【发布时间】:2010-09-21 00:11:48
【问题描述】:

我刚开始尝试在 C++ 中将 OpenGL 用于一个类(我之前在 Java 中使用过很多次)。我开始尝试写一些实质性的东西,但我无法阻止 Seg 故障,所以我写了这段小代码,几乎是红皮书第一章示例中的一行复制代码。它还有 Seg 故障。我的问题是为什么。我已经尝试过 eclipse 和 netbeans,我的项目中都链接了 glut.h 库,我在使用 VMWare 的虚拟机上运行 64 位 ubuntu 10.4,都安装了 gcc 和 freeglut,netbeans 和 eclipse 都会运行我编写的常规(非 OpenGL)C++ 代码,而不会出现段错误。

这里是代码:

#include <stdlib.h>
#include <GL/freeglut.h>
#include <stdio.h>

void init(){
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);

}
void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0,1.0,1.0);
    glBegin(GL_POLYGON);
        glVertex3f(0.25, 0.25, 0.0);
        glVertex3f(0.75,0.25,0.0);
        glVertex3f(0.75,0.75, 0.0);
        glVertex3f(0.25, 0.75, 0.0);
        glEnd();
    glFlush();
}
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250,250);    //if I comment out this line,
    glutInitWindowPosition(100,100);
    glutCreateWindow(argv[0]);  //this line,
    init();  //this line and the glut main loop line it runs without any errors, but why wouldn't it? It's not doing anything now!
    glutDisplayFunc(display);
    glutMainLoop();    //if I comment out just this line I get illegal instruction instead of segfault but I need this line
    return 0;
}

线程 [1] 28944(暂停:信号:SIGSEGV:分段错误)
XF86DRIQueryVersion() 在 0x7ffff7e7412e XF86DRIQueryExtension() 在 0x7ffff7e742c9 0x7ffff7e73c70 0x7ffff7e53ff8 glXGetFBConfigs() 在 0x7ffff7e4c71e glXChooseFBConfigSGIX() 在 0x7ffff7e4cd97
fgChooseFBConfig() at freeglut_window.c:205 0x7ffff794a8c7
fgOpenWindow() at freeglut_window.c:768 0x7ffff794aac8
fgCreateWindow() 在 freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow() at freeglut_window.c:1,183 0x7ffff794a2a2 main() 在线程 [1] 28944(暂停:信号:SIGSEGV:分段错误) XF86DRIQueryVersion() 在 0x7ffff7e7412e XF86DRIQueryExtension() 在 0x7ffff7e742c9 0x7ffff7e73c70 0x7ffff7e53ff8 glXGetFBConfigs() 在 0x7ffff7e4c71e glXChooseFBConfigSGIX() 在 0x7ffff7e4cd97
fgChooseFBConfig() at freeglut_window.c:205 0x7ffff794a8c7
fgOpenWindow() at freeglut_window.c:768 0x7ffff794aac8
fgCreateWindow() 在 freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow() at freeglut_window.c:1,183 0x7ffff794a2a2 main() 在(这里的项目资料):54 0x40100b

【问题讨论】:

  • 我不确定从标题中编辑 OpenGL 是否会对 BioBuckyBall 有很大帮助,因为我指定 Ubuntu 仅在包含 OpenGL 元素时才不会与基本 C++ 代码发生段错误。因此,虽然您简化了标题,但也降低了它的准确性。
  • 发生段错误的堆栈跟踪是什么?你检查过glGetError()吗?
  • 其他 OpenGL 代码是否在同一虚拟机中运行? glxinfo 的输出是什么?
  • 当你运行可执行文件时,你传递了什么参数?
  • 确定不完全确定如何获取段错误的堆栈跟踪,但 Eclipse 告诉我运行调试模式时没有可用于“0x7ffff7e73c70”的源

标签: c++ opengl ubuntu segmentation-fault


【解决方案1】:

可以帮助: 在 glutInitDisplayMode 中添加 GLUT_DEPTH 对我有用这个标志,而不是没有(glutCreateWindow 的段错误)

【讨论】:

    【解决方案2】:

    虚拟机内部有硬件加速吗?使用 glxinfo 检查。 DRI 内部的崩溃表明您不这样做。

    【讨论】:

    • 显示名称:0.0 分段错误,这就是 glxinfo 告诉我的全部
    • 我显然在虚拟机设置中检查了加速 3D 图形,所以我想我应该这样做?
    • 虚拟机可能有硬件加速,但您需要在虚拟机内部的操作系统中安装驱动程序。
    • 我会确保您的 flgrx 版本匹配(或尽可能接近)Windows 驱动程序的版本。根据developer.amd.com/drivers/ccc/Pages/default.aspx,您似乎在 Win 7 下安装了 Catalyst 10.6 驱动程序。我会将 Windows 7 和 Ubuntu 都更新到 10.9。查看support.amd.com/us/gpudownload/Pages/index.aspx
    • 如果安装匹配的驱动程序不起作用,可能只是这是一个已知的错误:forums.virtualbox.org/viewtopic.php?f=3&t=30964(不知道你应该从这里做什么。)对不起。
    【解决方案3】:

    我在使用不同的代码并从 Mac OS X 10.6 远程使用 Debian 6.0 时遇到了类似的问题。有问题的机器使用的是 Radeon HD 5670 卡(尽管这应该不相关)。

    仔细检查后,似乎 OpenGL 本身的某些东西无法正常工作,因为不仅是我的代码失败了。

    我遇到的一些症状包括:

    • 使用 OpenGL 的程序在 XF86DRIQueryVersion() 处使用 SIGSEGV 崩溃
    • glxinfo/glxgears 也会与 SIGSEGV 一起崩溃

    对我来说,解决方案是删除 Radeon fglrx 驱动程序(删除所有具有 aptitude 能力的软件包)并安装“radeon”驱动程序。然后运行 ​​'sudo Xorg -configure' 生成新配置,使用 'sudo X -config /root/xorg.conf.new' 对其进行测试并将其复制到您的默认 xorg.conf 位置。

    之后程序不再因 SIGSEGV 崩溃,虽然我得到了一个不同的错误:

    • glxinfo 给出:得到错误:找不到 RGB GLX 视觉或 fbconfig
    • glxgears 给出:错误:无法获得 RGB、双缓冲视觉效果

    这似乎与直接渲染 (DRI) 带来的麻烦有关。对此的解决方案是通过设置“export LIBGL_ALWAYS_INDIRECT=yes”来禁用直接渲染。另一种方法是删除用于 DRI 的库(在我的例子中是 libgl1-mesa-dri)。

    我仍然不太相信这是整个 解决方案,因为当从远程终端仅使用 glxinfo 和 glxgears 时,fglxr 驱动程序应该无关紧要。我怀疑删除 fglxr 并安装 radeon 以某种方式解决了配置中的问题。

    我使用的一些参考资料包括:

    【讨论】:

    • 似乎错误与通过 SSH 隧道(在我的情况下从 Mac OS X 到 Debian 6.0)转发的图形有关,这会造成麻烦。当使用“直接”渲染时,这会产生第二组错误,当使用“间接”渲染时,opengl 程序会再次工作。另外:运行 glxinfo | grep "renderer string" 在我的 Mac 中提供 VGA 硬件,而不是远程机器。参见unix.stackexchange.com/questions/1437/…
    【解决方案4】:

    我的预感是,如果您编译以下精简示例,您仍然会遇到分段错误:

    #include <stdlib.h>
    #include <GL/freeglut.h>
    #include <stdio.h>
    
    int main(int argc, char** argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
        glutInitWindowSize(250,250);
        glutInitWindowPosition(100,100);
        glutCreateWindow("test window");
        return 0;
    }
    

    因为您的分段错误发生在:

    fgCreateWindow() at freeglut_structure.c:106 0x7ffff7948f62 glutCreateWindow()
    

    换句话说,它不能创建一个窗口(不管里面有什么)。我的猜测是,按照@Matias 的回答,您需要在您的虚拟机中启用 3D 加速?但这可能是显示驱动程序问题,32 位与 64 位,或者更险恶的问题,例如 freeglut 和您的 OpenGL 版本之间的不匹配——因此是我之前提出的一系列问题。你能重新编译这个精简版并发布结果吗?

    【讨论】:

    • 啊-我从您的 cmets 中看到您正在从 Win 7 x64 的 MS Virtual PC 中运行 Ubuntu 10.04 x64?我的猜测是,这是与他们更改 Win 7 中加载显示驱动程序的方式相关的错误的另一个实例。您是否修改了安装的引导参数 - 作为“noreplace-paravirt”?参见例如ubuntuforums.org/showthread.php?t=1466888nemesisv.blogspot.com/2009/04/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多