由于某种原因,一旦我引用第三方供应商的 dll 类,集成调试器就会导致错误。同样的代码在构建时运行,并作为发布运行,独立运行。 debug 和 release 这两个属性应该是一样的,因为我没有真正改变它们。我将 lib 文件添加到两个构建的路径中。我只是有:
ClassNameFromDll blah;
当它到达这里时,我得到这个异常:
MTGO SO Bot.exe 中 0x78a3f623 (mfc90ud.dll) 处的未处理异常: 0xC0000005: 读取位置0xf78e4568访问冲突。
它出现在:afxtls.cpp,第 252 行。
这是一个 MFC 应用程序,但我并没有真正使用任何 MFC,只是一个非常简单的 gui,它触发了一个全是 win32 的事件。我正在使用 Visual Studio 2008 Express。
最佳答案
查看我的 VC9 安装中的 atltls.cpp 文件,崩溃发生在此处:
inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
EnterCriticalSection(&m_sect);
ASSERT(nSlot != 0 && nSlot < m_nMax);
ASSERT(m_pSlotData != NULL);
ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED); // <== crash
// ...
}
所以在发布版本中没有发生崩溃的原因是因为 ASSERT() 在该版本中是一个空操作。我不熟悉 ATL 对线程本地存储的使用,但此断言表明某些东西正在请求一个尚未存储任何内容的槽中的值。
我不知道该 TLS 插槽的初始化是您的责任还是第 3 方 DLL 的责任。
看起来 GetThreadValue()
有一些额外的保护,这样它会在发布版本中为未初始化的槽返回一个 NULL 指针(虽然我不确定这是否能得到保证) - 我敢打赌,第 3 方 DLL 依赖于该行为(即,它检查 NULL 返回),因此在发布版本中不会发生崩溃。请注意,供应商可能正在间接使用 CThreadSlotData 类(堆栈跟踪会对此提供线索),因此他们可能不知道其期望。
关于c++ - C++ 中的 Visual Studio 调试错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/516431/