在 OpenGL 调试期间未加载 atio6axx.pdb [重复]

Posted

技术标签:

【中文标题】在 OpenGL 调试期间未加载 atio6axx.pdb [重复]【英文标题】:atio6axx.pdb not loaded during OpenGL debug [duplicate] 【发布时间】:2020-11-20 16:35:36 【问题描述】:

我正在使用 Visual Studio 和 C++ 为一个项目编写 OpenGL 代码。我创建了一个着色器,其中包含一个在源代码中正确链接和初始化的统一块。这是源代码部分:

unsigned int sunLightUBO;
glGenBuffers(1, &sunLightUBO);
glBindBuffer(GL_UNIFORM_BUFFER, sunLightUBO);
glBufferData(GL_UNIFORM_BUFFER, 48, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_UNIFORM_BUFFER, 0, 12, &sunDirection);
glBufferSubData(GL_UNIFORM_BUFFER, 12, 12, &sunAmbient);
glBufferSubData(GL_UNIFORM_BUFFER, 24, 12, &sunDiffuse);
glBufferSubData(GL_UNIFORM_BUFFER, 36, 12, &sunSpecular);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
unsigned int sunLightIndex = glGetUniformBlockIndex(floor.ID, "sunLight");
glUniformBlockBinding(floor.ID, sunLightIndex, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, sunLightUBO);

虽然这是与着色器相关的部分,特别是片段着色器:

layout (std140) uniform sunLight
                       //offset
    vec3 direction;     //0
    vec3 ambient;       //12
    vec3 diffuse;       //24
    vec3 specular;      //36
;

当我尝试编译时,它给了我这个错误:

我已经尝试解决这个问题一段时间了。我试图在整个互联网上搜索,寻找解决方案,但即使他们处理了 .pdb 文件未加载的问题,它们也不是对我有帮助的解决方案。

我在下面说明了我尝试过的所有内容:

    我激活了默认可用的两台服务器(Microsoft Symbol Servers 和 NuGet.org Symbol Server),并让所有模块加载而不会出现异常。我还尝试将“atio6axx.dll”设置为唯一要加载的模块。 因为我有一个 ATI Radeon 视频卡,所以我添加了作为服务器符号,由 AMD 提供的 https://download.amd.com/dir/bin 在网站上找到 https://gpuopen.com/learn/amd-driver-symbol-server/。即使添加并激活了这台服务器,我也尝试加载所有模块,然后只加载我需要的模块(atio6axx.dll)。 我通过链接 https://github.com/rajkumar-rangaraj/PDB-Downloader/releases/download/v1.0/PDBDownloader.exe 下载了 PDB 下载器,但它没有帮助,因为它无法下载我需要的文件。 我手动将atio6axx.dll文件复制到源码所在目录

如果我尝试在片段着色器中删除统一块,一切正常,所以肯定是因为它。我不知道还有什么可以尝试的,有人有解决方案吗?

编辑

我更正了有关偏移量和缓冲区中分配的内存的部分:

unsigned int sunLightUBO;
glGenBuffers(1, &sunLightUBO);
glBindBuffer(GL_UNIFORM_BUFFER, sunLightUBO);
glBufferData(GL_UNIFORM_BUFFER, 64, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_UNIFORM_BUFFER, 0, 16, &sunDirection);
glBufferSubData(GL_UNIFORM_BUFFER, 16, 16, &sunAmbient);
glBufferSubData(GL_UNIFORM_BUFFER, 32, 16, &sunDiffuse);
glBufferSubData(GL_UNIFORM_BUFFER, 48, 16, &sunSpecular);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
unsigned int sunLightIndex = glGetUniformBlockIndex(floor.ID, "sunLight");
glUniformBlockBinding(floor.ID, sunLightIndex, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, sunLightUBO);

layout (std140) uniform sunLight
                       //offset
    vec3 direction;     //0
    vec3 ambient;       //16
    vec3 diffuse;       //32
    vec3 specular;      //48
;

不幸的是,错误仍然存​​在并且始终相同

编辑 2

使用“Step Over”调试选项,我发现在到达创建 unsigned int sunLightUBO 的行时会引发异常:

unsigned int sunLightUBO; <--Here the exception is thrown
glGenBuffers(1, &sunLightUBO);
glBindBuffer(GL_UNIFORM_BUFFER, sunLightUBO);
glBufferData(GL_UNIFORM_BUFFER, 48, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_UNIFORM_BUFFER, 0, 12, &sunDirection);
glBufferSubData(GL_UNIFORM_BUFFER, 12, 12, &sunAmbient);
glBufferSubData(GL_UNIFORM_BUFFER, 24, 12, &sunDiffuse);
glBufferSubData(GL_UNIFORM_BUFFER, 36, 12, &sunSpecular);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
unsigned int sunLightIndex = glGetUniformBlockIndex(floor.ID, "sunLight");
glUniformBlockBinding(floor.ID, sunLightIndex, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, sunLightUBO);

在这条线之前,我只创建和链接一个着色器。在此之前,有使用 GLFW 初始化窗口和使用 GLAD 指向 OpenGL 函数的指针的所有经典行。 我还尝试初始化引发异常的变量,将其设置为 0,但它并没有改变任何东西。

解决方案

经过几次尝试,我决定在另一台电脑上测试该项目。我声明:我遇到错误的第一台电脑是 HP Pavilion dv6 6c80el,它配备了 ATI Radeon HD 7690M XT 显卡,已经使用了将近 10 年。另一方面,我测试该项目的第二台电脑显然在所有方面都更强大,并配备了 GTX 980。

在第二台电脑上调试时,我立即注意到控制台向我显示片段着色器代码中的错误,而第一台电脑没有显示。该错误与片段着色器 main 中使用的语法有关;为了引用统一块中的变量,我写了(在我的例子中)sunLight.direction(例如)。相反,你必须只写方向。不幸的是,控制台没有在第一台电脑中向我显示这些错误,因此我没有在最初的问题中插入有关 main 的代码,这是我的错误。无论如何,我不知道为什么控制台没有向我显示这些错误。我认为这是因为我的 Radeon 卡在调试方面的工作方式与 NVidia GTX 不同。

更正语法,控制台会再次开始向我显示错误。修复了这些最后的错误,总是与片段着色器有关(从 vec3 到 vec4 的转换问题......),程序正确启动。

另外,为了编写着色器,我使用了一个名为“GLSL 语言集成”的 Visual Studio 扩展。显然,这个扩展无法识别 GLSL 代码的所有语法错误,因为例如我写 sunLight.direction 而不是 direction 的事实并没有向我报告。因此,处理语法错误检查的引擎无法正常工作。例如,给定一个名为 vector 的 vec4,我可以编写 vector.rgbdsfuiweda 并且它不会将它作为错误报告给我。 换句话说,他无法识别的语法错误,混淆了对代码中许多其他可能错误的识别。所以你必须非常小心。

【问题讨论】:

AMD 是否提供此文件?您真的需要或想要调试您的 GPU 驱动程序吗?未加载的 pdb 不会影响程序的执行。它只是阻止您深入了解 dll 的细节。 您链接到的页面声明:“请注意,我们目前只托管二进制文件(在我们的例子中,这些是一组 DLL),而不是您需要的 PDB解析函数名称。目前没有发布 PDB 的计划。” 您不太可能调试到 GPU 驱动程序中。 我现在确实看到 AMD 符号服务器不提供 pdb,但是在这种情况下我对 AMD 符号服务器的目的有些困惑。 "atio6axx.pdb 未加载" 不是错误。错误是“抛出异常......访问冲突读取......”“atio6axx.pdb未加载”只是Visual Studio告诉你为什么它不能向你显示错误发生的代码 我不明白你的意思:调试你的 GPU 驱动程序这个文件的目的是查看内部实现细节显卡驱动。如果您想通过调用程序来了解驱动程序内部发生了什么,那么 pdb 文件将是必不可少的。您不需要或很可能不希望它运行或调试您的代码。未加载的消息不会在您的程序中引起任何类型的问题,并且您不需要修复它以继续处理您的项目。 【参考方案1】:

尝试调试 AMD GL 实施不会让您有任何见解。你应该改正你的 GL 代码:

glBufferData(GL_UNIFORM_BUFFER, 48, NULL, GL_STATIC_DRAW)

不,你的缓冲区太小,std140-layout 指定vec3 元素在 16 字节边界处对齐,所以:

layout (std140) uniform sunLight
                       //offset (yours)   CORRECT offset
    vec3 direction;     //0                0
    vec3 ambient;       //12               16 
    vec3 diffuse;       //24               32
    vec3 specular;      //36               48
;

【讨论】:

以上是关于在 OpenGL 调试期间未加载 atio6axx.pdb [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Opengl 4调试输出不起作用

在调试 ASP.NET MVC 应用程序期间未更新 CSS

OpenGL:纹理加载但未应用

在 Visual Studio 调试期间从哪里加载 user.config

在OpenGL中动态加载纹理的好方法是啥?

如何在应用程序加载期间捕获“未捕获的类型错误:无法读取未定义的属性‘isModel’?