我有一个使用winsock的应用程序。 I / O部分在另一个线程上处理。 我正在使用阻塞选择方法的套接字。 但重点是5-6小时后,我的应用程序在select函数行给出了0xC00000FD异常。
据我所知,当存在递归或非常大的局部变量时会发生此异常。但对我来说,情况都不是这样。
所以你知道为什么我会得到这个例外吗? 或者任何想要发现实际导致异常的想法?
非常感谢编辑2:
亲爱的所有人,我很抱歉,但由于复制案件需要很长时间,我才意识到这并没有解决问题。 当select函数行发生堆栈溢出异常时,一切似乎都正常。
我的意思是它是一个连接了一个客户端的服务器套接字。所以rset中有2个套接字,wset中有1个套接字。选择后,我正在检查所有准备好的套接字并进行必要,读,写,接受。超时为250毫秒。你认为这可能是问题吗?我不希望这个函数被阻塞,所以它不是null。但是,如果我使用{0,0}
,那将会是什么区别一个重要提示是: 当客户端套接字没有发送任何数据时,相同的代码工作没有任何问题。 但是,当我开始从客户端向服务器发送一些数据时,出现了这个问题。 我确信FD_SET和FD_CLR没有问题,我的意思是当客户端只发送1(服务器)套接字在rset中而1(客户端)在wset中时。
无论如何,我看了很多样本,但似乎没有区别。
请参阅下面的局部变量截图(我删除了可执行文件的名称,因为它是商业产品) 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()
ws2_32.dll!71ab314f()
xyz.exe!vm_socket_select(vm_socket * hds = 0x04c1fb84,int nhd = 1,int掩码= 7)行230 + 0x1b字节C
xyz.exe!ND :: nd_socket :: SocketThreadProc()第173行+ 0x12字节C ++
xyz.exe!ND :: nd_socket :: ThreadRoutineStarter(void * u = 0x07d63f90)Line 332 C ++
xyz.exe!_callthreadstartex()第348行+ 0x6字节C
xyz.exe!_threadstartex(void * ptd = 0x011a3ce8)第326行+ 0x5字节C
kernel32.dll!7c80b713()
我在等待任何建议。 非常感谢
答案 0 :(得分:3)
您是否尝试过一段时间后在调试器中停止程序?然后看看它可能给你一个提示的堆栈。
递归并不意味着你的一个函数无休止地调用它,它不会更棘手,并且在它返回之前涉及多个层。