2010-02-06 6 views
0

winsock을 사용하는 응용 프로그램이 있습니다. I/O 부분은 다른 스레드에서 처리됩니다. 그리고 소켓에 대한 선택 차단 방법을 사용하고 있습니다. 하지만 요점은 5-6 시간 후, 내 응용 프로그램이 선택 기능의 라인에서 0xC00000FD 예외를 제공한다는 것입니다.winsock select 함수에서 스택 오버플로 예외 (0xC00000FD)

내가 아는 한,이 예외는 재귀 또는 매우 큰 지역 변수가있을 때 발생합니다. 그러나 그들 중 어느 누구도 나를위한 경우는 아니다.

이 예외가 발생하는 이유는 무엇입니까? 아니면 실제로 예외가되는 것을 발견하는 아이디어가 있습니까?

많은 감사

편집 2 :

친애하는 모든, 나는 매우 죄송하지만, 사건을 재현하는 것은 시간이 오래 걸립니다 때문에, 난 그냥이 문제가 해결되지 않았 음을 깨달았다. select 함수의 줄에서 스택 오버플로 예외가 발생하면 모든 것이 정상적으로 처리됩니다.

즉, 하나의 클라이언트가 연결된 서버 소켓입니다. 따라서 rset에는 2 개의 소켓이 있고 wset에는 1 개의 소켓이 있습니다. 선택 후 모든 준비 소켓을 확인하고 필수, 읽기, 쓰기, 승인합니다. 제한 시간은 250ms입니다. 이것이 문제가 될 수 있다고 생각하십니까? 이 함수가 블로킹되어 null이 아니기를 바랄뿐입니다. 클라이언트 소켓이 데이터를 전송하지 않은 경우
같은 코드는 문제없이 작동했다 : 나는 중요한 힌트는 {0,0}

를 사용하는 경우 그러나 정확한 차이가있을 것입니다. 그러나 클라이언트에서 서버로 데이터를 보내기 시작했을 때이 문제가 발생했습니다. FD_SETs 및 FD_CLRs에는 문제가 없습니다. 클라이언트가 rset에 1 (서버) 소켓을 보내지 않고 wset에 1 (클라이언트) 만 보낼 때입니다.

어쨌든 나는 샘플을 많이 보았지만 차이는없는 것으로 보인다.

지역 변수는 아래의 스크린 샷 여기 http://img192.imageshack.us/img192/1948/stackoverflow.jpg

(나는이 상용 제품이기 때문에, 실행 파일의 이름을 삭제 한) 그리고 참조하십시오 호출 스택입니다! NTDLL.DLL 7c90df3a()
[프레임 아래 잘못된 및/또는 누락 될 수 NTDLL.DLL] mswsock.dll! 71a53c9c()
NTDLL.DLL! 7c90d26c()
mswsock.dll로드없이 심볼! 71a55f9f()
mswsock.dll! 71a55974
! 1,363,210 WS2_32.DLL 71ab314f()

xyz.exe vm_socket_select 라인 + 230 바이트 0x1b C
xyz.exe (HDS vm_socket * = 0x04c1fb84, INT NHD = 1, 마스크 = 7 INT)를 ND! : !! nd_socket :: SocketThreadProc() 선 (173)는 0x12 바이트 + C++
xyz.exe ND : nd_socket :: ThreadRoutineStarter (무효 * U = 0x07d63f90) 라인 (332) C++
xyz.exe _callthreadstartex() 라인 (348)은 0x6 + 바이트 C
xyz.exe! _threadstartex (void * ptd = 0x011a3ce8) 줄 326 + 0x5 바이트 C
kernel32.dll!7c80b713()

나는 어떤 조언도 기다리고있다. 많은 감사

+2

코드를 알려주시겠습니까? –

답변

3

시간이 지나면 디버거에서 프로그램을 중지 해 보셨습니까? 그런 다음 힌트를 줄 수있는 스택을 살펴보십시오.

재귀는 함수 중 하나가 끝없이 자신을 호출한다는 것을 의미하지는 않습니다. 반복이 시작되면 다시 돌아 오기 전에 까다로워 질 필요가 없습니다.

+0

또는 디버거에서 크래시가 발생했을 때 스택을 살펴보십시오. –

+0

네, 그렇지만 5 시간이 걸립니다 :) –