2009-02-05 13 views
1

어떤 이유에서든 통합 디버거가 이므로이 타사 공급 업체의 dll 클래스를 참조하자 마자 오류가 발생합니다. 이 코드는 빌드 될 때 실행되고 독립 실행 형으로 실행됩니다. 디버그 및 릴리스의 두 속성은 내가 실제로 변경하지 않은 것과 동일해야합니다. 두 빌드의 경로에 lib 파일을 추가했습니다. 나는 단순히 있습니다Visual Studio에서 C++의 오류 디버깅

MTGO SO Bot.exe에서 처리되지 않은 예외 0x78a3f623 (mfc90ud.dll)에서 : 가 0xc0000005 : 액세스 위반 읽기 위치 0xf78e4568

가 여기까지 도착
ClassNameFromDll blah; 

, 나는이 예외가 . 라인 (252)

이는 MFC 응용 프로그램입니다, afxtls.cpp,하지만 난 정말 모든 Win32에서있는 이벤트를 발생시키는 매우 간단한 GUI를보다 MFC 기타를 사용하고 있지 않다 :

이 발생합니다. Visual Studio 2008 Express를 사용하고 있습니다.

답변

1

심령 디버깅에게

이 릴리스 모드 벌금에서 실행 및 디버그 모드에서 충돌이 발생, 특히, 당신은 어떻게 든 참고로 관리했습니다 믿고 그 DLL의 릴리스 버전을 날 리드는 사실을 참여 (mfc90u .dll)을 사용하여 라이브러리 자체를 참조하고 링커에서 가져올 버전을 결정할 수 있도록합니다.

이 응용 프로그램에서 MFC를 사용하지 않을 수도 있지만 MFC 응용 프로그램으로 작성하는 경우 원하는지 여부에 관계없이 모든 MFC 자료를 가져옵니다 (즉, MFC 종속성도 해결해야 함). 문제 및 응용 프로그램과 함께 MFC DLL을 배송).

+0

어쩌면 나는이 코드를 모두 가져 와서 곧장 C++ 프로젝트로 되돌려 놓아야 할까? 필요한 것은 GUI 만있었습니다 : 텍스트 상자 1 개, 버튼 1 개, 버튼 1 개 이벤트. – Zombies

+1

좋습니다. MFC는 하나의 윈도우에 대해서만 가져올 수있는 상당히 무거운 물건입니다. – TheSmurf

+0

"심령 디버깅"은 좋은 것입니다 ... – Naveen

0

게시 할 수있는 스택 추적이 있습니까? 몇 가지 유용한 정보가있을 수 있습니다.

타사 DLL이 여전히 공급 업체에서 적극 지원되는 경우 가장 먼저해야 할 일은 공급 업체에게 보낼 수있는 매우 간단한 프로그램에서 동일한 문제가 발생할 수 있는지 확인하는 것입니다. 그것을 고쳐라.

공급 업체가 사용할 수 없거나 충분히 응답하지 않으면

: 당신이 제 3 자 DLL의 소스를 가지고 쉽게 자신의 버전을 구축 할 수있는 경우

, 당신은 아마 공급 업체에 점점 부족이를 디버깅하는 가장 좋은 방법은 (이 당신을 지원하기 위해). 소스 디버깅 가능 DLL을 쉽게 만들 수없는 경우에도 생성자의 어셈블리 지침을 추적하고 소스를지도로 사용하여 진행 상황을 이해하는 데 도움이됩니다.

제 3 자 DLL 소스가없는 경우에도 가장 좋은 방법은 ClassNameFromDll의 생성자를 추적하여 문제가 무엇인지 잘못 판단하는 것입니다. 디버그 빌드와 릴리스 빌드의 지침 경로를 비교하는 것이 도움이 될 수 있습니다.

MFC 소스는 MSVC와 함께 배포됩니다 (Express 버전이 아닐지도 모릅니다 만 다른 모든 버전에서 생각할 수 있습니다). MFC DLL의 코드에 들어가면 소스가 무엇인지 파악하는 데 유용 할 수 있습니다. 계속.

+0

해당 dll은 tessdll.dll입니다. 그것은 릴리스 빌드에서 응용 프로그램을 실행할 때 잘 작동합니다. – Zombies

2

atltls에서 보겠습니다.내 VC9에서 CPP 파일은 충돌 여기에서 발생하는 설치 : ASSERT()가 그 빌드에서 어떤 조합이 없기 때문에

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 
    // ... 
} 

그래서 충돌이 릴리스 빌드에서 발생하지 않는 이유는. ATL이 쓰레드 로컬 스토리지를 사용하는 것에 익숙하지 않지만이 어설 션은 무언가가 아직 저장되지 않은 슬롯에서 값을 요구하고 있음을 나타냅니다.

TLS 슬롯의 초기화가 사용자의 책임인지 제 3 자 DLL의 책임인지는 모르겠습니다.

GetThreadValue()에는 초기화되지 않은 슬롯의 릴리스 빌드에 NULL 포인터가 반환 될 것 같은 추가 보호 기능이 있습니다 (단, 이것이 보장 될지는 확실하지 않지만). 파티 DLL은 해당 동작에 의존합니다 (즉, NULL 반환을 확인). 릴리스 빌드에서 충돌이 발생하지 않습니다. 벤더가 CThreadSlotData 클래스를 간접적으로 사용하고있을 가능성이 있습니다 (스택 트레이스는 이에 대한 단서를 제공합니다). 따라서 기대치를 알지 못할 수도 있습니다.

관련 문제