c++ - C++ 中的 Visual Studio 调试错误

标签 c++ visual-studio winapi debugging unhandled-exception

由于某种原因,一旦我引用第三方供应商的 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/

相关文章:

visual-studio - 我应该将引用的 DLL 二进制文件存储在我的 Visual Studio 解决方案中的什么位置

c# - 重新启动普通线程

visual-studio - 如何在 Visual Studio 2010 中的 .xaml 文件中折叠 .cs 文件?

c++ - 我该如何解决这个缓冲区溢出问题?

java - 无法在 JNI 中调用 ctor?

c++ - Visual Studio 可以告诉我哪个断言失败了吗?

c++ - 如何在其定义附近使用显式长度/值构造函数初始化 vector 成员变量?

c++ - 是否可以删除子函数中的对象?

algorithm - 是否可以设计我们自己的算法来创建唯一的 GUID?

c++ - Win32 键盘加速器不工作 C++