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

标签 c++ visual-studio-2010 opengl 64-bit first-chance-exception

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

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

First-chance exception at 0x0055f838 in Ant Simulation.exe: 0xC0000005: Access violation reading location 0x00bb0000.
Unhandled exception at 0x0055f838 in Ant Simulation.exe: 0xC0000005: Access violation reading location 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 时出现的错误:

Problem Event Name: APPCRASH

Application Name: Ant Simulation.exe
Application Version: 0.0.0.0

Application Timestamp: 511d99a3

Fault Module Name: StackHash_0a9e

Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000

Exception Code: c0000005

Exception Offset: 0037f278

OS Version: 6.1.7601.2.1.0.256.48

Locale ID: 1031

Additional Information 1: 0a9e

Additional Information 2: 0a9e372d3b4ad19135b953a78882e789

Additional Information 3: 0a9e

Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

最佳答案

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

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

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

关于c++ - 在 Win7 64 位上因未处理的第一次机会异常而崩溃(在 XP 32 位、Linux 64 位上没有问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14896688/

相关文章:

c++ - 在 C++ 中将 PUNICODE_STRING 与 regex_match 结合使用

c++ - 在 C++20 中,立即函数的默认参数在哪个上下文中被替换(在源位置示例中)?

c# - VS2010性能分析: How can I identify Worker Threads?(CurrentThread.Name产生异常)

c++ - OpenGL glGetUniformBlockIndex在nvidea GPU上返回INVALID_INDEX

c++ - 在 OpenGL 中快速画线

c++ - 如何在类周围共享参数 - C++

c++ - 访问 ogre 中的视口(viewport)像素值

visual-studio - 为什么是 Intellisense "Unavailable for C++/CLI"?

c# - 为什么 Office Interop 引用在 VS 2010 中显示错误

opengl - C++ OpenGL Cube Map Perlin Noise to Sphere