C++ Visual Studio在C++;

C++ Visual Studio在C++;,c++,visual-studio,winapi,debugging,unhandled-exception,C++,Visual Studio,Winapi,Debugging,Unhandled Exception,由于某种原因,集成调试器在我引用第三方供应商的dll类时立即导致了一个错误。这段代码在作为发行版独立构建和运行时运行。debug和release的两个属性应该是相同的,因为我没有真正修改它们。我将lib文件添加到两个版本的路径中。我只是: ClassNameFromDll blah; 当它到达这里时,我得到一个例外: MTGO SO Bot.exe中0x78a3f623(mfc90ud.dll)处未处理的异常: 0xC0000005:访问冲突读取位置0xf78e4568 它出现在:afxtls

由于某种原因,集成调试器在我引用第三方供应商的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。

进行心理调试

它在发布模式下运行良好,在调试模式下崩溃,这让我相信您以某种方式设法引用了该DLL的发布版本(mfc90u.DLL),而不是引用库本身并允许链接器决定导入哪个版本


在此应用程序中,您可能没有使用MFC进行任何操作,但如果它是作为MFC应用程序构建的,则无论您是否愿意,您都将获得所有MFC内容(这意味着您还必须解决MFC依赖性问题,并随应用程序一起提供MFC DLL)。

您是否可以发布堆栈跟踪?它可能有一些有用的信息

如果供应商仍然积极支持第三方DLL,那么您应该做的第一件事是查看您是否可以使用一个非常简单的程序来出现相同的问题,您可以将该程序发送给供应商,并要求他们修复该问题

如果供应商不可用或响应不够:

如果您有第三方DLL的源代码,并且可以轻松构建自己的版本,那么您可能有最好的调试方法(除了让供应商支持您之外)。即使无法轻松构建源代码可调试DLL,也可以跟踪构造函数的汇编指令,并将源代码用作映射来帮助您了解发生了什么

即使您没有第三方DLL的源代码,我认为最好的做法是跟踪
ClassNameFromDll
的构造函数,试图找出哪里出了问题。比较调试版本和发布版本中的指令路径可能会有所帮助


MFC源代码与MSVC一起分发(可能不与Express版本一起分发,但我认为与所有其他版本一起分发),因此当您访问MFC DLL的代码时,您可能会发现该源代码有助于了解发生了什么。

查看我的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
    // ...
}
inline void*CThreadSlotData::GetThreadValue(int nSlot)
{
关键部门(m_部门);
断言(nSlot!=0&&nSlot断言(使用m_pSlotData[nSlot].dwFlags和SLOT_)/HEH,也许我应该把所有代码都放回直C++项目中?我所需要的只是一个简单的GUI:1个文本框,1个按钮,按钮按下的1个事件。可能是最好的。MFC是一个非常简单的东西,只需要输入一个窗口。我想最终会有人得到它。DLL是TestDL.DLL。它工作得很好。当我从发布版本运行应用程序时。