我正在尝试使用工具集12_xp将旧版产品从VC6升级到VS2013。我可以让项目编译得很好但是我得到一个运行时ASSERT,它似乎与CSingleLock lock()调用有关。
CSingleLock slock(&CV7CmnSS::m_cs); // Wait for access
slock.Lock(m_dwTimeout); // <- this is the line that does it.
CV7CmnSS::m_cs
在此项目引用的另一个dll中的另一个类中声明为静态对象。
exe的头文件有CCriticalSection CV7CmnSS::m_cs;
在CV7CmnSS头文件static CCriticalSection m_cs;
我尝试单步执行MFC代码(我知道,我知道......) 这是我能得到的更多......
mfc120d.dll!CCriticalSection :: Lock(unsigned long dwTimeout)第118行C ++ //&lt; - 来自调用堆栈窗口
_AFXMT_INLINE BOOL (::CCriticalSection::Lock(DWORD dwTimeout))
{
ASSERT(dwTimeout == INFINITE);
(void)dwTimeout;
return Lock();
}
断言I框我得到:
相当通用..
dll项目都针对相同的工具集12_xp,两者都使用MBCS,两者都使用MFC作为共享dll。两者都使用多线程调试DLL设置。
我怀疑是一个交叉线程问题?但我不知道该怎么办。
如果我能提供更多信息,请告诉我。
修改
我忘了添加这个小宝石,如果我在发布中运行该程序而没有调试我可以进一步使用该应用程序,但是这个奇怪的消息弹出....
答案 0 :(得分:4)
您展示的代码揭示了问题:需要dwTimeout参数为INFINITE的断言。正如您在代码中看到的那样,并且如CCriticalSection::Lock文档中所述,该参数被忽略,因此您只需更改代码以将INFINITE作为参数传递,或者只调用不带参数的重载(做同样的事情。)
至于为什么错误在发布模式下不会发生,因为断言只是在调试模式下编译,所以断言永远不会发生。无论导致该消息框的是什么都与断言完全无关。