【问题标题】:Weird behavior with gcc 4.9.2 on linux [closed]linux上gcc 4.9.2的奇怪行为[关闭]
【发布时间】:2015-12-27 13:11:33
【问题描述】:

几天来,我一直在调试一些在 Windows 上运行的代码的黑色纹理问题,今天我发现它可能与我处理 openGL 调用的方式无关。以下代码 sn-p 包含一个 @ 987654322@线。

如果我注释掉 cout 行,我会得到黑色纹理。如果我把它留在代码中,我会得到正确渲染的纹理。

std::vector<unsigned char> png_data;

loadPNG("texture.png", width, height, format, png_data);

// COMMENT LINE!
// std::cout << "First RGBA value is " << std::hex << png_data[0] << " " << png_data[1] << " " << png_data[2] << " " << png_data[3] << std::endl;

glGenTextures(1, &texture_id);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture_id);

glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, png_data.data());

我做错了吗?这是编译器问题吗?

【问题讨论】:

  • 如果您不能立即从这个问题中挤出声誉,并且您对花了 2 分钟阅读和理解它感到沮丧,请不要密切投票,但要解释为什么您认为这不值得询问或回答。
  • 如果没有看到展示问题的完整示例,如何回答?首先,loadPNG 做了什么?几乎可以肯定,您未显示的代码中存在 UB。
  • @AlanStokes 在这里发帖太长了,here's the function I'm using
  • 注释掉loadPNG并将png数据初始化为已知的简单图像,如绿色方块。
  • 那么您的问题可能出在loadPNG 或之前的某个时间。使用valgrind 查找内存错误。

标签: c++ linux opengl gcc


【解决方案1】:

不,这不是编译器问题。

这是未定义行为/损坏内存的经典示例。在您的代码到达此部分之前的某个时间点,错误最终会破坏堆或堆栈,方法是运行数组的末尾、取消引用未初始化的指针或无数其他未定义行为的示例。

此时,损坏的性质还不足以导致立即出现段错误或崩溃,但代码会继续执行,直到您到达此部分。此时,取决于随机因素,其中代码对齐和其他 C++ 库调用本身可能涉及堆分配,足以触发您在此处观察到的未定义行为的可见结果。

恐怕没有单一的通用方法来识别真正的错误。这将是反复试验的结合,并使用诸如 valgrind 之类的检测工具来识别和隔离真正的错误。 valgrind,在您的 Linux 发行版中提供,在识别和定位此类错误方面有着良好的记录。

【讨论】:

  • 原来我有一些帧之前的堆栈损坏。在stackoverflow上调试它太难了,我不得不自己花一些时间。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多