在Win7 64位上因未处理的首次机会异常而崩溃(在XP 32位、Linux 64位上没有问题)

Crash over unhandled first chance exception on Win7 64bit (no issue on XP 32bit, Linux 64bit)

本文关键字:64位 32位 XP 有问题 崩溃 Linux 异常 未处理 Win7 机会      更新时间:2023-10-16

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

到目前为止,我们只是为我们的模型绘制顶点,它在两个系统上都很好(我知道,我知道:不推荐使用,但我们仍然是初学者)。现在,他包含了一个库来导入三维网格并制作动画。对他来说一切都很好,但我有

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时,它通常不起作用,但有一次我可以启动它。我在其他窗口上复制了错误。我们在Linux 64位上尝试过,没有问题。我试着在兼容模式下运行它,但问题仍然存在(仍然崩溃)。

我四处搜索,发现了以下内容:
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.76001.2.1.0.256.48

区域设置ID:1031

附加信息1:0a9e

附加信息2:0a9e372d3b4ad9135b953a78882e789

附加信息3:0a9e

附加信息4:0a9e372d3b4ad9135b953a78882e789

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

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

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