Как отследить нарушение доступа

У меня есть MFC DLL. При инициализации он использует LoadLibrary в другой библиотеке. Когда вызывается мой деструктор, он вызывает FreeLibrary. MFC dll является сервисным объектом OPOS (SO). При этом я создал простую программу на C #, которая использует OPOS для связи с SO. Сообщалось, что когда пользователь использует команду OPOS Close (), иногда происходит сбой (Windows 7) или он просто исчезает (Windows XP). Мы ласково назвали эту ошибку Close on Close. Это была большая шип на моей шее. Хотя я работаю над этим SO около года, я признаю, что моих навыков отладки C ++ крайне не хватает. Я больше из C # парня. Теперь я не уверен, что это потому, что я сейчас использую предварительный просмотр VS2013, или у VS2010 и VS2012 просто нет хорошего отладчика для программ на C ++, или я просто не понял, на что смотрю (я буду ручаться за вторую) Отладчик указывает на функцию из этой библиотеки, которая загружена. Почти всегда это одна и та же функция, но я думаю, что я получу эту ошибку для любой из функций в этой библиотеке. Так что я совершенно не знаю, как сузить причины этого. Это не делает это каждый раз.

Я знаю, что этот код не очень поможет. Но хорошо … Я не знаю, где еще искать. Так что этот код работает. Это код, который используется для 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]