| 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
Отправил хак в рассылку. Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять. |