2009-01-16 5 views
7

이것은 상당히 관련된 버그이며, 다른 도움을 얻을 수있는 곳을 찾기 위해 노력했지만, "Vista에서의 프로그램 충돌"이 가장 유용한 쿼리는 아닙니다.종료 후 크래시 디버깅? (메인 반환 후)

내가 겪고있는 문제는 WinMain()이 반환 된 후 OpenGL과 Windows API를 사용하는 그래픽, 다중 스레드 데이터 시각화 소프트웨어가 작동하고 있다는 것입니다. 나는 스택 루틴을 살펴볼뿐만 아니라 종료 루틴을 단계별로 시도해 보았고, 어셈블리가 아닌 코드의 마지막 비트는 실제 ExitProcess (0) 호출에서 충돌하는 _crtExitProcess이다. 그 후 스택 추적은 kernel32.dll과 네 개의 ntdll.dll을 보여 주며 실제로 충돌이 발생합니다.

이 버그는 Vista에서만 발생하며 XP에서 실행될 때 똑같은 코드가 정상적으로 종료됩니다. 이 문제를 디버그하는 데 도움이 될만한 것을 생각할 수 없으며,이 문제를 디버깅하는 것은 실제로 배운 적이없는 것입니다. 어떤 도움을 주시면 감사하겠습니다.

+0

정확히 예외는 무엇입니까? –

+0

0xC0000005 - 액세스 위반. –

+0

purify와 같은 메모리 디버거에서 실행 했습니까? 나에게 메모리 문제가있는 것처럼 보입니다 ... –

답변

5

나는 주위를 파고 조금 짓을했는지, 그리고 당신이 앓고있는 유일한 사람 아니에요 제안 주위 게시물의 몇 가지 발견했습니다

W를 :

특히, 두 번째는 톰 CHM 언급 관심이다 우리는 우리의 루트 원인을 확인하고 가상 소멸자를 인터페이스 클래스 래퍼에 추가하면 우리의 문제가 해결되는 것으로 보입니다. 그러나 우리는 크래시의 정확한 원인을 알고 을 확인하여 양탄자 아래의 실제 문제를 제거하지는 않았습니다.

문제는 소멸자 어딘가에서 또는 그 결함이 일 수 있습니다. 디버거를 부착하고 종료 프로세스를 단계적으로 수행 할 수있는 방법이 있다면 도움이 될 것입니다.

당신은 전체 스레드를 읽고 당신이 배울 수있는 것이 있는지 볼 수 있습니다. 즉, 귀하가 이미 귀하의 검색에서 이러한 게시물을 발견하지 않은 경우입니다.

+0

http://support.microsoft.com/kb/941833 매우 관련성이 높습니다. 감사합니다. 이 컴퓨터는 클라이언트 용이므로 업데이트를 실행할 수는 없지만이를 수행하도록 지시 할 수 있습니다. 버그는 우리가 가진 것과 동일하게 보입니다. –

+0

당신은 모든 것을 비교적 쉽게 고칠 수 있기를 바랍니다. 이런 종류의 버그는 알아내는 것이 가장 어렵습니다. –

+0

소멸자가 없기 때문에 프로그램이 어떻게 충돌 할 수 있습니까? 기억이 누출되지 않을까요? –

3

소멸자 문제와 조금 비슷합니다.

종료시 파괴 된 개체가 있는지 확인하십시오. 이것은 주로 전역 또는 정적 객체입니다. 더 이상 유효하지 않은 무언가에 접근하는 경우를 대비해 소멸자를주의 깊게 살펴보십시오. 다중 스레드 환경에서는 다른 스레드가 스레드를 계속 사용하는 동안 오브젝트가 삭제되는 경쟁 조건이 될 수 있습니다.

개체가 삭제되면 로그를 작성하십시오. 예 :

SomeClass::~SomeClass() 
{ 
    WriteLog("Begin ~SomeClass()"); 
    // do whatever 
    WriteLog("End ~SomeClass()"); 
} 

WriteLog()는 로그 파일을 열고 파일을 쓰고 닫은 다음 파일을 플러시해야합니다. 충돌을 피하기 위해 뮤텍스 또는 크리티컬 섹션을 사용하는 것이 좋습니다.

충돌 후 로그를 보면 어떤 일이 벌어지고 있는지에 대한 단서가 있습니다.

+0

이것이 소멸자 중 하나라면 스택 추적에 나타나지 않습니까? 또한, Vista와 XP의 차이점은 무엇입니까? –

+0

소멸자는 상당히 C++ 전용입니다. C++ 런타임에서 호출됩니다. – MSalters