【问题标题】:OpenGL getShaderInfoLog Bus Error 10OpenGL getShaderInfoLog 总线错误 10
【发布时间】:2017-07-06 06:25:14
【问题描述】:

当我运行以下代码(或我尝试过的任何变体)时,我得到一个总线错误。它编译得很好。

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <fstream>
#include <iostream>
#include <stream>
void main() {
    /* * * * * * * * * * * * * * * * * *
     * Code that loads the shader file.*
     * This works fine, error is later.*
     * * * * * * * * * * * * * * * * * */
    /* * * * * * * * * * * * * * * * * *
     * Code that generates OpenGL      *
     * shader and compiles it. Works.  *
     * * * * * * * * * * * * * * * * * */

    // Check for errors compiling shader
    bool status;
    glGetShaderiv(shaderId, GL_COMPILE_STATUS, &status);
    if(status == GL_FALSE) {
        // Compiler errors
        GLchar* log = (GLchar*) "\0";
        GLint len = 0;
        GLint rLen = 0;
        glGetShaderiv(this->shaderId, GL_INFO_LOG_LENGTH, &len);
        // Next line causes bus error 10
        glGetShaderInfoLog(this->shaderId, len, &rLen, log);
        std::cerr << "Error compiling shader: " << this->filename << ":\n\t" << log << std::endl;
    }
}

我在 Mac OSX 上运行它。如果 glGetShaderInfoLog 被注释掉,它工作正常(虽然 glGetProgramInfoLog 会导致相同的错误)。以下是崩溃报告中的一些重要信息。

异常类型:EXC_BAD_ACCESS (SIGBUS)

异常代码:0x000000010cd5c0f0 处的 KERN_PROTECTION_FAILURE

异常说明:EXC_CORPSE_NOTIFY

终止信号:总线错误:10

终止原因:命名空间信号,代码 0xa

终止进程:exc handler [0]

0x10cd5c0f0 附近的 VM 区域:

--> __TEXT 000000010ccc4000-000000010cd5f000 [ 620K] r-x/rwx SM=COW /Users/USER/*

__DATA 000000010cd5f000-000000010cd64000 [ 20K] rw-/rwx SM=COW /Users/USER/*

0 libsystem_platform.dylib 0x00007fffcc50fefc _platform_memmove$VARIANT$Haswell + 92

1 GLEngine 0x00007fffbbeda274 gleGetString + 52

2 GLEngine 0x00007fffbbe22d20 glGetShaderInfoLog_Exec + 141

3 程序 0x000000010cd357af Shader::validate() + 127

4 程序 0x000000010cd35575 Shader::compile() + 1621

5 程序 0x000000010cd349ed Program::link() + 45

6 程序 0x000000010cd3235e Object::Object(char*, char*, char*, char*) + 222

7 程序 0x000000010cd32c65 Object::Object(char*, char*, char*, char*) + 53

8 程序 0x000000010cd2e7c0 main + 4576

9 libdyld.dylib 0x00007fffcc2ff255 开始 + 1

【问题讨论】:

    标签: c++ macos opengl bus-error sigbus


    【解决方案1】:

    glGetShaderInfoLog 的最后一个参数告诉它要将日志写入何处。您将字符串文字 "\0" 传递给它。你告诉它用日志文件覆盖这个字符串文字。

    覆盖字符串文字是未定义的行为;实际上,它通常会导致您的程序崩溃。即使你可以覆盖它,你也没有提供足够的空间。

    您应该分配一些空间来保存日志。像这样的:

    glGetShaderiv(this->shaderId, GL_INFO_LOG_LENGTH, &len);
    vector<char> log(len);
    glGetShaderInfoLog(this->shaderId, log.size(), &rLen, log.data());
    // to get the log as a C string use log.data()
    

    【讨论】:

    • 很好,让我开始走上正轨。不起作用,因为 glGetShaderInfoLog 需要一个 char* 才能使用。相反,我做了以下事情: GLint len = 0; glGetShaderiv(this->shaderId, GL_INFO_LOG_LENGTH, &len); char* 日志[len]; glGetShaderInfoLog(this->shaderId, len, &rLen, log[0]);
    • 这似乎对我有用。它打印日志并且不会导致崩溃。
    • NVM,我忘记了 glGetShaderInfoLog 中的 .data()。它有效。
    猜你喜欢
    • 2016-07-14
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多