我们有一个基于32位Visual C ++ / MFC(多文档界面-MDI)的应用程序,它是使用Visual Studio 2005编译的。
我们正在Windows Server 2008 R2(64位)上运行具有ATI显卡的应用程序(确切地说是ATIES1000版本8.240.50.5000)。
我们在软件的某些部分使用OpenGL。
问题是在执行与基于OpenGL的窗口初始化相关的代码后,软件会随机崩溃。在代码中包含大量跟踪后,我们发现执行wglCreateContext()
function后程序执行异常;它跳过当前函数的其余代码,用于初始化基于OpenGL的Window,而是开始执行应用程序的默认View(绘图)功能(例如ApplicationView::OnDraw
)。
在为默认视图执行几行代码之后,程序在尝试访问主文档成员变量时会生成异常。我们的unhandled exception filter能够捕获异常并生成执行转储,但执行转储除了指定异常代码为c0000090
之外,也没有提供太多有用的信息。
问题非常随机,仅报告仅出现在此Windows服务器环境中。
解决这种情况的任何帮助或提示?
编辑:
换句话说,程序结构看起来像这样,执行在wglCreateContext()
函数之后随机跳过行,执行几行ApplicationView::onDraw
然后导致异常:
void 3DView::InitializeOpenGL()
{
....
Init3DWindow( m_b3DEnabled, m_pDC->GetSafeHdc());
m_Font->init();
....
}
bool 3DView::Init3DWindow( bool b3DEnabled, HDC pHDC)
{
...
static PIXELFORMATDESCRIPTOR pd = {
sizeof (PIXELFORMATDESCRIPTOR), // Specifies the size
1, // Specifies the version of this data structure
...
};
int iPixelFormat = ChoosePixelFormat(pHDC, &pd);
if(iPixelFormat == 0)
{
...
}
bSuccess = SetPixelFormat(pHDC, iPixelFormat, &pd);
m_hRC = wglCreateContext(pHDC);
//Execution becomes abnormal afterwards and control exits from 3DView::Init3DWindow
if(m_hRC==NULL)
{
...
}
bSuccess = wglMakeCurrent(pHDC, m_hRC);
....
return true;
}
void ApplicationView::OnDraw(CDC* pDC)
{
...
CApplicationDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
...
double currentValue = pDoc->m_CurrentValue;
//EXCEPTION raised at the above line
double nextValue = pDoc->nextValue;
}