1

我在 Visual Studio Express 2010 下用 C++ 编写 OpenGL 程序时遇到了一个奇怪的问题。
我使用:Windows 7 64bit,OpenGl 4.x
我的伙伴使用:Windows XP 32bit,Visual Studio Express 2010,OpenGl 2.x

到目前为止,我们只是为我们的模型绘制了顶点,并且它在两个系统上都可以正常工作(我知道,我知道:已弃用,但我们仍然是初学者)。现在他包含了一个库来导入 3d 网格并制作动画。对他来说一切正常,但我明白了

Ant Simulation.exe 中 0x0055f838 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00bb0000。
Ant Simulation.exe 中 0x0055f838 处未处理的异常:0xC0000005:访问冲突读取位置 0x00bb0000。

使用调试器,我将问题追溯到该行

glDrawArrays(GL_QUADS,0,n_data);

我试图捕捉代码,但没有触发任何东西。很奇怪,昨天我可以用调试器在这条线上重复 2-3 次,直到它崩溃,今天它直接崩溃了。我昨天检查了n_data每次都是一样的。如果我在 Windows 中执行 *.exe,它会崩溃(下面的错误代码)。当我的伙伴向我发送他的 *.exe 时,它​​通常不起作用,但我可以启动它 1 次。我在其他窗口上重现了该错误。我们在 Linux 64bit 上试过,没有问题。我尝试在兼容模式下运行它,但问题仍然存在(仍然崩溃)。

我四处搜索,发现:
https ://blogs.msdn.com/b/debugger/archive/2010/05/12/visual-studio-debugger-fails-to-catch-unhandled-exception-for-a-windows -form-or-wpf-application.aspx?Redirected=true

不确定我是否理解正确。有一个我无法捕获但会杀死应用程序的异常 - 但为什么其他系统没有出现此异常的问题?

我试图按照链接中描述的方式解决它,但似乎在 VS Express 中我没有抛出第一次机会异常的菜单。我会尝试获得 VS 2012,但我还是想知道:这是一个完全 Windows 的东西,还是我的代码有问题导致崩溃(如链接中的评论之一所建议)?我也非常感谢解释实际发生的事情......

运行 *.exe 时出现的错误:

问题事件名称:APPCRASH

应用程序名称:Ant Simulation.exe
应用程序版本:0.0.0.0

应用程序时间戳:511d99a3

故障模块名称:StackHash_0a9e

故障模块版本:0.0.0.0
故障模块时间戳:00000000

异常代码:c0000005

异常偏移量:0037f278

操作系统版本: 6.1.7601.2.1.0.256.48

区域设置 ID:1031

附加信息 1:0a9e

附加信息 2:0a9e372d3b4ad19135b953a78882e789

附加信息 3:0a9e

附加信息 4:0a9e372d3b4ad19135b953a78882e789

4

1 回答 1

4

Windows 中的“第一次机会异常”不是 C++ 异常,它意味着运行时系统检测到程序的非法行为,例如取消引用无效指针。事实上,“访问冲突读取位置 0x00bb0000”非常表明这就是正在发生的事情。

取消引用无效指针不一定会在不同系统上或什至在同一台机器上的不同运行上导致相同的行为:有关更多信息,请参阅Windows 中的 C 代码崩溃等问题,但在 Linux中则不然。在这种情况下,错误似乎发生在 GL 实现内部,但这可能是由于早期的应用程序代码提供了错误信息造成的。

检查所有启用的顶点数组是否至少有n_data元素。(要特别小心,确保它们不只有n_data - 1元素,并且n_data保持您期望的值。)您还应该检查您之前传递给 GL 函数的任何指针是否有效。还有更多的 GL 状态需要检查,但这是我的第一个猜测。

于 2013-02-15T14:51:37.737 回答