2009-07-18 3 views
1

내 응용 프로그램 (VC MFC) 페이지 힙 사용하여 gflags 실행 페이지 힙 손상을 추적 할 수 있습니다.CSocket :: 내 MFC 응용 프로그램에서 throwing 예외 만들기

이제 응용 프로그램이 충돌하고있다 그리고 내가

사람이 정확히 발생했습니다 이유가 무엇인지에 빛을 던져 수 (자원 inavailablity의 느낌을하는 것보다 다른)이 라인을 해석 할 수있는이 오류를 보여줍니다 응용 프로그램의 충돌?

(정보 : 응용 프로그램은 다중 스레드 하나 인 멀티에, 실행에 대한 500 스레드 - 프로세서 시스템)이 실제 힙 손상 문제, 또는 당신의 프로그램이 충돌 단지 경우 궁금

kernel32!RaiseException+53 
msvcrt!_CxxThrowException+36 
mfc42u!AfxThrowResourceException+19 
mfc42u!AfxRegisterWndClass+ab 
mfc42u!CAsyncSocket::AttachHandle+5c 
mfc42u!CAsyncSocket::Socket+25 
mfc42u!CAsyncSocket::Create+14 

답변

0

Pageheap을 사용하여 실행 한 결과 리소스 제한.

정확한 세부 정보는 기억이 나지 않지만 Pageheap은 여분의 메모리 오버 헤드를 유발하므로 Pageheap이 활성화되지 않은 경우보다 훨씬 빨리 메모리를 소모 할 수 있습니다.

500 개의 스레드가 실행 중일 때 각각에 대해 1MB의 스택과 함께 동적으로 할당 한 메모리가 있습니다.

CAsyncSocket::AttachHandle 창이 창을 만들 수없는 경우 AfxThrowResourceException을 트리거합니다. Pageheap으로 인해 시스템이 포화 된 것 같습니다.

문제를 재현하려면 500 개의 스레드를 실행해야합니까? 아마 그 수를 조금 줄이면 더 많은 자원을 이용할 수있을 것입니다.

+0

예 페이지 힙은 더 많은 메모리를 요구하지만 힙 손상 삽입 점이 필요합니다. 응용 프로그램을이로드 된 상태로 실행하면 응용 프로그램이 충돌합니다. 여기 충돌의 또 다른 지점이 있습니다. 하이 엔드 컴퓨터 (8 코어 및 4GB RAM)에서 응용 프로그램을 실행하는 경우,이 특정 위치에서 충돌 한 많은 사례가 있습니다. mfc42u! CFixedAlloc :: Alloc + 5c mfc42u! CString :: AllocBuffer + 25 mfc42u! CString :: CString + 3e WP_Communications_Server! CWPGenericService :: AddToMessageLog + b9 단서가 있습니까? 우리는 2 주 이상이 문제에 갇혀 있습니다. – buddingspacer

+0

Full Pageheap이 필요하거나 http://support.microsoft.com/kb/286470에 따라 Normal로 시도 할 수 있습니까? 힙이 손상되었으므로 힙이 손상 될 수 있습니다. 당신은 내 질문에 답을하지 못했습니다. 테스트 도중 리소스를 절약하기 위해 실행중인 스레드의 양을 줄이는 기회가 있습니까? 또는 500 스레드가 실행 중일 때만 문제가 발생합니까? –

4

이 동일한 문제로 인해 많은 어려움이 발생했지만 마침내 문제가 해결되어 작동 중입니다. 이는 [주 응용 프로그램 스레드가 아닌 다른] 스레드 내에서, 우리는

CSocket socket; 
socket.Create(); 

그것은 것입니다 처리되지 않은 예외를 throw처럼 뭔가를하려고하면 MFC 소켓 라이브러리 버그입니다. 그것에 대한 기사를 찾았습니다. See What Microsoft says about this

마이크로 소프트의 말에 의하면 나도 도움이되지 못했습니다. 그래서 여기에 내가 찾은 해결 방법이 있습니다. 그리고 그것은 저와 같은 좌절 된 동료를 도울 수 있기를 바랍니다. 스레드 내부

, 그것은 소켓 핸들의 할당을 통해 이미 생성 된로 그 후이

CSocket mySock; 
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
mySock.m_hSocket= sockethandle; 

이 mySock.Create를 호출하지 마십시오 않습니다. mySock.Attach (sockethandle)를 사용할 수 있는지 확실하지 않습니다. 아직 시도하지 않았습니다.

그런 다음 Connect 등을 직접 호출 할 수 있습니다.

소켓 사용을 마쳤 으면 mySock.Close()으로 전화하지 말고 closesocket(mySock.m_hSocket);으로 전화하면 소켓 개체가 해제됩니다. Attach가 위의 경우에 작동하면 소켓을 해제 할 때 여기에서 분리를 수행해야합니다.

굿 럭

+0

여기에 귀하의 게시물에 대한 아니 었으면 내 문제를 발견하지 못했습니다. 이전 MFC 응용 프로그램을 서비스로 사용하려고했는데 왜 서비스 내에서 Create() 및 Listen()을 호출 할 수 없는지 알 수 없었습니다. 나는 잘못된 경로에 있었고 네트워크 액세스 권한과 관련이 있다고 생각했지만 실제로 CAsyncSocket에 창이 필요하다는 사실과 관련이있었습니다. Attach()는 서비스 내에서 여전히 작동하지 않지만, 적어도 이제 문제가 어디에서 발생하는지 알고 있습니다. 아마도 WinSock을 사용하여 CSocket 구현을 직접 작성할 것입니다. 대단히 감사합니다! – jbx

관련 문제