winsock 选择函数中的堆栈溢出异常 (0xC00000FD)

Posted

技术标签:

【中文标题】winsock 选择函数中的堆栈溢出异常 (0xC00000FD)【英文标题】:Stack Overflow exception (0xC00000FD) at winsock select function 【发布时间】:2010-02-06 11:55:19 【问题描述】:

我有一个使用winsock 的应用程序。 I/O 部分在另一个线程上处理。 我正在对套接字使用阻塞选择方法。 但关键是,在 5-6 小时后,我的应用程序在选择函数行给出了 0xC00000FD 异常。

据我所知,当存在递归或非常大的局部变量时会发生此异常。但对我来说,它们都不是。

那么你知道我为什么会得到这个异常吗? 或者有什么想法可以发现真正导致异常的原因?

非常感谢

编辑 2:

尊敬的各位,非常抱歉,由于复制案例需要很长时间,我才意识到这并没有解决问题。 当 select 函数行发生堆栈溢出异常时,一切似乎都正常。

我的意思是它是一个连接了一个客户端的服务器套接字。所以rset中有2个socket,wset中有1个。选择后,我正在检查所有准备好的套接字并设置必需的、读、写、接受。超时为 250 毫秒。你认为这可能是问题吗?我不希望这个函数被阻塞,所以它不为空。但是如果我使用 0,0 会有什么区别

一个重要的提示是: 当客户端套接字没有发送任何数据时,相同的代码可以正常工作。 但是当我开始从客户端向服务器发送一些数据时,出现了这个问题。 我确信 FD_SETs 和 FD_CLRs 没有问题,我的意思是当客户端不发送时,只有 1(服务器)套接字在 rset 中,1(客户端)在 wset 中。

反正我看了很多样片,但好像没啥区别。

请看下面的局部变量截图(我已经删除了可执行文件的名称,因为它是一个商业产品) http://img192.imageshack.us/img192/1948/***.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 mask=7) 第 230 行 + 0x1b 字节 C xyz.exe!ND::nd_socket::SocketThreadProc() 第 173 行 + 0x12 字节 C++ xyz.exe!ND::nd_socket::ThreadRoutineStarter(void * u=0x07d63f90) 第 332 行 C++ xyz.exe!_callthreadstartex() 第 348 行 + 0x6 字节 C xyz.exe!_threadstartex(void * ptd=0x011a3ce8) 第 326 行 + 0x5 字节 C kernel32.dll!7c80b713()

我正在等待任何建议。 非常感谢

【问题讨论】:

你能给我们看看代码吗? 【参考方案1】:

您是否尝试在运行一段时间后在调试器中停止您的程序?然后看看堆栈,它可能会给你一个提示。

递归并不意味着您的某个函数会无休止地调用自己,它不能再复杂了,并且在它回到它开始的地方之前涉及多个层。

【讨论】:

或者只是在调试器中查看崩溃时的堆栈。

以上是关于winsock 选择函数中的堆栈溢出异常 (0xC00000FD)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV findContours 堆栈溢出

OpenARK-SDK.exe 中 0x00007FF74F27A526 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x0000000000000001、0x000000EEC5803FD

VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)

OpenCL 堆栈溢出。如何解决?

函数 堆栈溢出

带有类实例的堆栈溢出异常