繁体   English   中英

C ++中的Visual Studio调试错误

[英]Visual Studio Debuging Errors in C++

由于某种原因,一旦我引用了第三方供应商的dll类,集成调试器就会导致错误。 此相同的代码在构建并作为发行版运行时会独立运行。 调试和发布的两个属性应该相同,因为我没有真正更改它们。 我将lib文件添加到两个版本的路径中。 我只是有:

ClassNameFromDll blah;

当到达这里时,我得到了这个异常:

MTGO SO Bot.exe中0x78a3f623(mfc90ud.dll)的未处理异常:0xC0000005:访问冲突读取位置0xf78e4568。

它出现在:afxtls.cpp,第252行。

这是一个MFC应用程序,但是除了一个非常简单的gui之外,我没有真正使用任何MFC,它会触发一个完全为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插槽的初始化是您的责任还是第三方DLL的责任。

看起来GetThreadValue()具有一些附加保护,例如它将在发行版本中为未初始化的插槽返回NULL指针(尽管我不确定这是否可以保证)-我敢打赌,第三方DLL依赖于该行为(即,它检查是否为NULL返回),因此在发行版本中不会发生崩溃。 请注意,供应商可能会间接使用CThreadSlotData类(堆栈跟踪会提供有关此方面的线索),因此他们可能不知道其期望。

进行心理调试

它可以在释放模式下正常运行,而在调试模式下崩溃,这一事实使我相信您已经设法以某种方式设法引用了该DLL的发行版(mfc90u.dll),而不是引用了库本身并允许链接器决定要导入的版本。

您可能没有在此应用程序中使用MFC,但如果它是作为MFC应用程序构建的,则无论是否需要,您都将获得所有MFC的东西(这意味着您还必须解决MFC依赖性问题并交付MFC依赖项)。带有您的应用的MFC DLL)。

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

如果供应商仍在积极支持第三方DLL,那么您应该做的第一件事就是查看可以发送给供应商并要求他们修复的非常简单的程序是否会遇到相同的问题。

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

如果您拥有第三方DLL的源代码并且可以轻松地构建自己的版本,则可能是调试此版本的最佳方法(缺少供应商的支持)。 即使您无法轻松构建可通过源代码调试的DLL,也可以跟踪构造函数的汇编指令,并将源代码用作映射来帮助您了解正在发生的事情。

即使您没有第三方DLL的源代码,我也认为最好的做法是通过ClassNameFromDll的构造函数进行跟踪,以找出问题所在。 比较Debug版本和Release版本中的指令路径可能会有所帮助。

MFC源代码随MSVC一起分发(可能不随Express版本一起发布,但我认为与所有其他版本一起发布),因此当您进入MFC DLL的代码时,您可能会发现该源代码有助于确定正在发生的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM