Исключение переполнения стека (0xC00000FD) в функции выбора winsock - PullRequest
0 голосов
/ 06 февраля 2010

У меня есть приложение, которое использует winsock. Часть ввода / вывода обрабатывается в другом потоке. И я использую метод выбора блокировки для сокетов. Но дело в том, что через 5-6 часов мое приложение выдает исключение 0xC00000FD в строке функции выбора.

Насколько я знаю, это исключение возникает, когда есть рекурсия или очень большие локальные переменные. Но ни один из них не относится ко мне.

Так у вас есть идеи, почему я получаю это исключение? Или есть идеи, чтобы узнать, что на самом деле вызывает исключение?

большое спасибо

РЕДАКТИРОВАТЬ 2:

Уважаемые все, мне очень жаль, но поскольку воспроизведение дела занимает много времени, я просто понял, что это не решило проблему. Все выглядит нормально, когда в строке функции select возникает исключение переполнения стека.

Я имею в виду, что это сокет сервера с одним подключенным клиентом. Таким образом, есть 2 сокета в rset и 1 в wset. После выбора проверяю все готовые розетки и делаю необходимые, читаю, пишу, принимаю. Тайм-аут составляет 250 мс. Как вы думаете, может ли это быть проблемой? Я не хочу, чтобы эта функция блокировала, поэтому она не равна нулю. Но какая будет точная разница, если я буду использовать {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 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 Ответ

3 голосов
/ 06 февраля 2010

Вы пытались остановить свою программу в отладчике после некоторого времени работы? Затем взгляните на стек, который может дать вам подсказку.

Рекурсия не означает, что одна из ваших функций вызывает себя бесконечно, она не может быть более сложной и включать несколько слоев, прежде чем она вернется туда, где она началась.

...