如何追踪访问冲突

时间:2013-07-02 20:54:44

标签: c++ access-violation loadlibrary

我有一个MFC DLL。初始化时,它在另一个库上使用LoadLibrary。当我的析构函数被调用时,它调用FreeLibrary。 MFC dll是OPOS服务对象(SO)。话虽如此,我做了一个简单的C#程序,它使用OPOS与SO对话。据报道,当用户使用OPOS命令Close()时,它有时会崩溃(Windows 7)或者只是消失(Windows XP)。我们亲切地称这个错误关闭关闭。它一直是我脖子上的主要刺。虽然我已经在这个SO上工作了大约一年,但我承认我的C ++调试技能非常缺乏。我更像是一个C#家伙。现在我不确定是不是因为我现在正在使用VS2013预览,或者VS2010和VS2012只是没有一个很好的C ++程序调试器,或者我只是不明白我在看什么(我' d保证第二个任何人。调试器指向加载的库中的函数。它几乎每次都是相同的函数,但我认为我会在该库中的任何函数中得到此错误。所以我完全不知道如何缩小造成这种情况的原因。它并不是每次都这样做。

我知道这段代码不会有多大帮助。但是......我不知道还有什么地方可以看。所以这段代码有效。它是用于LoadLibrary的代码

#define INITPROCADDR(dllIns,funcName) (FARPROC&)funcName = GetProcAddress(dllIns,#funcName);\
    if(NULL==funcName){\
    CString szMsg;\
    szMsg.Format(_T("Function: %s can't be found."),#funcName);\
    AfxMessageBox(szMsg);\
    FreeLibrary(dllIns);\
    return FALSE;\
}
BOOL MasterRD_Load_rfLib(HINSTANCE *phInstMaster)
{
        CString strDll;
        LPTSTR szBuf = strDll.GetBuffer(MAX_PATH);
    GetModuleFileName(AfxGetInstanceHandle(), szBuf, MAX_PATH);
        strDll.ReleaseBuffer();
        strDll = strDll.Left(strDll.ReverseFind('\\') + 1);

    strDll += _T("\\MasterRD.Dll");

    *phInstMaster = LoadLibrary(strDll);         
    if(!(*phInstMaster))
    {
        AfxMessageBox(_T("Can't load MasterRD.dll!"));
        exit(0);
        return FALSE;
    }

    INITPROCADDR((*phInstMaster), rf_GetVer);
    INITPROCADDR((*phInstMaster), rf_DES_Encrypt);
    //Load rest of the functions
}

这就是实例化服务对象时的使用方法

private:
    HINSTANCE  m_hMasterRD;

    if (!MasterRD_Load_rfLib(&m_hMasterRD))
    {
        m_hMasterRD = NULL;
    }

所以关闭并不多。我有一个正在运行的后台线程被关闭。该后台线程大量使用MasterRD。关闭时我会这样做

for(int i=0; i<100; i++)
{
    GetExitCodeThread(ReaderThread, &exitStatus);
    if(exitStatus==3)
        break;

    Sleep(10);
}
CloseHandle(ReaderThread);
ReaderThread = NULL;

现在我的程序并不总是崩溃,但是当它崩溃时它总是在关闭时崩溃。目前,我们总是参考MasterRD中的一个功能。所以...我不知道。我怎么知道为什么我对该图书馆的引用偶尔会消失。我想它可能是那个库,但我不太了解C ++如何验证这一点。想法?

0 个答案:

没有答案