Summary: | Meta Trader после обновления стало подвисать соединение с сервером | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Denis V. Chernosov <denis0.ru> |
Component: | Сетевые возможности ; TCP/IP | Assignee: | Александр Морозов <amorozov> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | minor | ||
Priority: | P4 | CC: | kondratyuk, lav |
Version: | 1.0.9 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | 6988 | ||
Bug Blocks: | 42, 1143 | ||
Attachments: |
Лог terminal.exe во время зависания
Хак, предотвращающий зависание terminal.exe |
Description
Denis V. Chernosov
2009-02-02 10:57:39 MSK
Установил 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
Отправил хак в рассылку. Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять. |