Проблема точно есть на версиях 1.0.8 и 1.0.9 в сборке для AltLinux. mfc42.dll подкладываю от XP SP2. Дистрибутив от компании Телетрейд (http://www.teletrade.ru/files/telesetup_exe.zip) Точного алгоритма для воспроизведения нет. У меня часто подвисает при первом запуске после установки (возможно оттого, что список символов в окне "обзор рынка" большой). Бывают повисалочки после открытия письма с регистрационной информацией (про кодировку я баг уже добавил). Повисание выражается в смене значка соединения в правом нижнем углу на сообщение "нет связи" или "неправильный счет". Потом без перезапуска программы восстановить связь не получается. Попытки рестартануть (Файл - Логин) приводят к полному повисанию терминала. Проблемы стабильно проявляются на десятке машин с альтами на борту. Сначала грешил на узкий канал, но потом пришли вести с полей, что в другом офисе помог переезд на Убунту (видимо с ванильным вайном). Сам пока не пробовал, но из Сизифа ванильную сборку качнул. Буду посмотреть. Готов сотрудничать всеми силами, потому что бага очень неприятная!!!
Установил TeleTRADER 4.00 в бутылке bugs/3421. У меня при первом запуске всегда логинится нормально. Если попробовать перелогиниться (при щелчке левой кнопкой мыши в правом нижнем углу появляется меню, в котором можно выбрать пункт "Логин"), введя неверный пароль, то выводит "Нет связи". После этого перелогиниться с верным паролем иногда не удаётся, бывает, что программа при этом зависает. Если подождать, то программа может выйти из состояния зависания. После этого подключиться не получается. Конец лога перед зависанием: trace:winsock:WS_socket af=2 type=1 protocol=6 trace:winsock:WSASocketA af=2 type=1 protocol=6 protocol_info=(nil) group=0 flags=0x1 trace:winsock:WSASocketW af=2 type=1 protocol=6 protocol_info=(nil) group=0 flags=0x1 trace:winsock:WSASocketW created 018c trace:winsock:WS_connect socket 018c, ptr 0x7c527340 { family 2, address 80.94.84.12, port 1950 }, length 16 trace:winsock:WSASendTo socket 018c, wsabuf 0x3210dc, nbufs 1, flags 0, to (nil), tolen 0, ovl (nil), func (nil) trace:winsock:WSASendTo fd=122, options=0 trace:winsock:WSASendTo after WS2_send trace:winsock:WSASendTo _is_blocking(s) trace:winsock:WSASendTo before poll (timeout -1)
При первом запуске логинится нормально, но на многих машинах где-то после 10 полученных байтов (по счетчику справа снизу) отваливается. И дальше уже никак - повисает намертво. Пошаманил с чистой установкой и настройками вайна - многим помогло. Но остались повисалочки после открытия письма с регистрационной информацией. После его закрытия тоже бывает повисание соединения. Если быстро переключиться несколько раз между закладками окна Терминал, то бывает вылетает совсем. Но это уже может и к другому багу относиться... В общем, плавающий баг. Что от меня требуется для локализации проблемы?
(In reply to comment #2) > В общем, плавающий баг. Что от меня > требуется для локализации проблемы? > Видимо, логи падений или способ воспроизведения.
TeleTRADER зависает, когда пытается подключиться к хосту, к которому подключиться не удаётся. WS_connect выполняет poll с бесконечным таймаутом. <wine@cellar bottle peoples/amorozov/3421>$ WINEDEBUG=+winsock wwxp terminal.exe 2>&1 | grep connect trace:winsock:WS_connect socket 0130, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16 trace:winsock:WS_connect socket 0130, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16 trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16 trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16 trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16 trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 81.177.9.109, port 443 }, length 16 trace:winsock:WS_connect socket 0134, ptr 0x7c484374 { family 2, address 80.94.84.12, port 1950 }, length 16 <wine@cellar bottle peoples/amorozov/3421>$ telnet 80.94.84.12 1950 Trying 80.94.84.12... <wine@cellar bottle peoples/amorozov/3421>$ telnet 81.177.9.109 443 Trying 81.177.9.109... Connected to 81.177.9.109. Escape character is '^]'. eeee Connection closed by foreign host. Реализация WSASendTo в WINE тоже содержит poll, который будет вызван с бесконечным таймаутом, если специально не задана величина таймаута для сокета. http://msdn.microsoft.com/en-us/library/ms740532(VS.85).aspx SO_SNDTIMEO The timeout, in milliseconds, for blocking send calls. The default for this option is zero, which indicates that a send operation will not time out. Если верить MSDN, то WSASendTo действительно по умолчанию должен ждать бесконечно.
Ну я приблизительно так и подозревал :) А что делать?
> А что делать? Можно поместить сюда логи WINEDEBUG=+winsock при зависаниях, с комментариями, при каких условиях это получилось. Можно подождать, когда будет исправлена проблема с зависанием при перелогинивании, и протестировать у себя wine с исправлениями.
В Windows connect при подключении к не отвечающему хосту ждёт не вечно, а около 21 секунды. Если в Wine заменить везде бесконечные таймауты на 20-секундные, то TeleTRADER зависает не навсегда, но всё же вполне заметно. В Windows же ничего подобного добиться не удалось. Скорее всего, проблема не в таймаутах, а где-то в другом месте.
Created attachment 1046 [details] Лог terminal.exe во время зависания terminal.exe висит между строчками trace:winsock:WSASendTo before poll (timeout -1) и trace:winsock:WSASendTo after poll
terminal.exe создаёт более 20 потоков. Добавил в трейсы функций RegisterClassExW, WIN_CreateWindowEx, WS_connect и WSASendTo вывод идентификатора потока. В получившемся логе присутствуют 3 потока, один из них имеет дело с сокетами, один - с графикой, а ещё один (который на самом деле запущен самым первым) - с тем и другим одновременно. Когда этот поток застревает в poll, интерфейс программы зависает.
Если не будет найдено лучшего решения, то можно использовать хак, предотвращающий замирание в poll первого потока terminal.exe.
Created attachment 1047 [details] Хак, предотвращающий зависание terminal.exe
Отправил хак в рассылку.
Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять.