Когда перестает работать отладчик

Администрирование - Тестирование и исправление

Полагаю, некоторые коллеги уже оказывались в ситуации, когда отладка внезапно пропадала, и различные "шаманские" методики (переустановка платформы, чистка локального кэша и прочее) результата не давали. Опишу свой опыт по выявлению и устранению причины.

Преамбула

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

Начальное состояние

Периодические отваливается отладка. Основные подозреваемые - брандмауэр и антивирус выключены.

Анализ

Текущий порт отлачика tcp://srv1c:1562.

netstat -naot 1 | find "1562" при запуске сеанса отладки показывает наличие состояний SYN_SENT.

Настроен полный технологический журнал, поскольку заранее неизвестны события, содержащие необходимую информацию. Для сбора данных по клиентским сеансам моего пользователя файл настроек расположен в %UserProfile%\AppData\Local\1C\1cv8\conf

<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\v8\client\logs" history="1">
        <event>
            <ne property="name" value=""/>
        </event>
        <property name="all">
        </property>
    </log>
</config>

Значимые события технологического журнала клиента, собранного с момента запуска сеанса отладки до момента прекращения появления состояний SYN_SENT:

30:25.862000-0,EXCP,1,process=1cv8,ClientID=0,Exception=NetDataExchangeException,Descr='server_addr=any:1560 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=src\DataExchangeServerImpl.cpp' 
30:25.862003-0,EXCP,1,process=1cv8,ClientID=0,Exception=NetDataExchangeException,Descr='server_addr=any:1561 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=src\DataExchangeServerImpl.cpp' 
30:25.862006-0,EXCP,1,process=1cv8,ClientID=0,Exception=NetDataExchangeException,Descr='server_addr=any:1562 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=src\DataExchangeServerImpl.cpp' 
30:30.199000-0,EXCP,3,process=1cv8,Usr=Админ,ClientID=3,Exception=NetDataExchangeException,Descr='server_addr=tcp://127.0.0.1:1562 descr=127.0.0.1:1562:10060(0x0000274C): Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. ; 
line=1043 file=src\DataExchangeTcpClientImpl.cpp' 
30:34.208000-0,EXCP,3,process=1cv8,Usr=Админ,ClientID=4,Exception=NetDataExchangeException,Descr='server_addr=tcp://127.0.0.1:1562 descr=127.0.0.1:1562:10060(0x0000274C): Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. ; 
line=1043 file=src\DataExchangeTcpClientImpl.cpp'

Ошибка 10048(0x00002740) является причиной, 10060(0x0000274C) - следствие.

Настройка TCP протокола

MaxUserPort

При соединение по TCP/IP открывается сокет и выбирается динамический порт. По умолчанию, диапазон динамических портов от 1024 по 5000. Увеличиваем до максимума.
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Value: MaxUserPort
Data Type: REG_DWORD
Range: 5000 to 65534
Default value: 5000
Recommended value: 65534

MaxUserPort

TcpTimedWaitDelay

Когда соединение TCP закрывается, то сокет сразу не освобождается, а переходит в статус TIME_WAIT и ресурсы освободятся только через определённое время. По умолчанию, только через 4 минуты. Снизим это время до минимума - 30 секунд.
Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Value: TcpTimedWaitDelay
Data Type: REG_DWORD
Range: 30 to 300
Default value: 240
Recommended value: 30

TcpTimedWaitDelay

Отключение автотюнинга tcp протокола:
netsh int tcp set global autotuninglevel=disabled

Выполняем перезагрузку.

Результат

Мониторинг сервера в течении нескольких дней показал, что после проведенных изменений даже при большом количестве сессий 1С отладка перестала отваливаться.

См. также

Комментарии
1. Stas Bor (stas1976) 14 14.06.17 10:42 Сейчас в теме
17. Egor Gl (Green2) 2 20.09.17 09:12 Сейчас в теме
(1)>где тут лайк ставить :))
В самом верху страницы есть звездочка, это и есть лайк
2. Имя Фамилия (login1020) 14.06.17 10:47 Сейчас в теме
Я так понимаю, что это рекомендации к клиент-серверной версии, а что делать при такой же беде с файловой базой?
3. Алексей Т. (CratosX) 100 14.06.17 12:03 Сейчас в теме
(2) а какая именно у вас беда? На файловой не может быть точно такой же
7. Михаил Андрияшкин (mickey.1cx) 129 14.06.17 14:35 Сейчас в теме
(2) без разницы, техжурнал собирается для клиента 1С
4. Имя Фамилия (login1020) 14.06.17 12:46 Сейчас в теме
Однажды, пропала отладка для всех имеющихся баз на локальном пк, чистка кэша, отключение антивируса, брендмауэра не помогла. Впоследствии отладка сама включилась через несколько дней, из значимых событий на пк в эти дни было только обновление Skype...
5. Сергей Старых (tormozit) 4594 14.06.17 13:46 Сейчас в теме
(4) Кончился диапазон портов для предметов отладки.
6. Имя Фамилия (login1020) 14.06.17 14:03 Сейчас в теме
(5) как это проверить можно было?
8. Роберт В е р т и н с к и й (v3rter) 14.06.17 14:36 Сейчас в теме
Единственное, что смущает - попадание в зарезервированный диапазон динамических (эфемерных ) портов 49152 - 65535.
Может лучше сначала Range: 5000 to 49000 ?
9. Михаил Андрияшкин (mickey.1cx) 129 14.06.17 15:08 Сейчас в теме
(8) я нашел следующие разъяснения насчет диапазонов портов:
1. Номер порта выделяется для каждой сетевой службы, чтоб они работали независимо;
2. Порт назначается временно и только на время соединения. После завершения сеанса соединения порт снова становится свободен для использования, хотя в большинстве реализаций просто происходит увеличение на единицу номера последнего использованного порта вплоть до исчерпания всего диапазона эфемерных портов.
3. Номер порта - это абстракция, относящаяся к транспортному уровню (TCP & UDP), более низкие уровни (IP, ICMP, IGMP) - не имеют такой абстракции;
4. "Размещаются" порты в стеке TCP/IP, т.е. в реализованной в составе ОС части, т.е. программисту это не важно;
5. Порты для UDP & TCP - совершенно разные пространства, т.е. 21 порт UDP и 21 порт TCP - это 2 совершенно разные сущности.
6. Наконец, порты TCP/UDP подразделяются на "хорошо известные порты" (номера 0 - 1023), "динамические" (из диапазона 1024 - 49151), и "эфемерные" (49152 - 65535). Хорошо известные порты приписаны стандартным службам: telnet, ftp etc. и использоваться не должны (для других целей). Динамические порты - должны регистрироваться в международном комитете для использования новыми службами широкого применения. Эфемерные порты - это порты "оставленные" разработчикам для использования в своих частных задачах (где попало...). Никаких гарантий об неконфликтности эфемерных портов в условиях эксплуатации, естественно, не даётся.

В этом контексте использование "эфемерного" диапазона не должно привести к каким то проблемам.
Можно более подробно разобрать, что вас смущает. Полагаю, полезно будет для всех.
10. Вячеслав Кадацкий (marsohod) 120 14.06.17 17:45 Сейчас в теме
Странно, у меня по умолчанию такие параметры установлены (только в шестнадцатиричной системе исчисления). Win 7 x64.
Может, стоит уточнить для каких ОС этот рецепт предназначен?..
11. Михаил Андрияшкин (mickey.1cx) 129 14.06.17 22:18 Сейчас в теме
(10) по умолчанию этих параметров в соответствующих разделах реестра нет. В вашем случае, когда добавляли эти параметры, перед вводом значений не переключили предварительно систему исчисления в десятичную. При создании в форме ввода значения параметра по умолчанию установлена шестнадцатиричная, что объясняет ваши значения.
12. Дмитрий Бичин (VirDim) 16.06.17 13:46 Сейчас в теме
Применил параметры реестра, всё равно отладка не работает. Отлаживаю вебсервис (на клиенте и сервере отладка работает). На локальном компьютере iis и конфигуратор, на сервере сервер 1с и sql. Фаерволы, антивирусы отключены. В публикации прописал адрес отладки (в разных вариациях пробовал) из настроек отладки. Автоматическое подключение вебсервисов стоит. В тех журнале на клиенте такое (см скрин). Делал netsh winsock reset - не помогло. Есть какие-то мысли?

P.S. Отладка вчера работала, а сегодня отвалилась. Перезагружал и сервер и свою машину по нескольку раз, ничего не помогает.
Прикрепленные файлы:
13. Михаил Андрияшкин (mickey.1cx) 129 16.06.17 15:45 Сейчас в теме
(12) попробуйте сделать дополнительно восстановление первоначальной конфигурации winsock
http://www.cyberforum.ru/networks-faq/thread1102068.html
14. Дмитрий Бичин (VirDim) 17.06.17 10:37 Сейчас в теме
(13) Да, я делал так, как было в инструкции, но это всё равно не помогло. В итоге, после n-ной попытки переопубликации вебсервиса и перезапуска его, отладка удивительным образом заработала. Шайтан...
15. Сергей Яцкевич (Nigmatul) 19.09.17 11:04 Сейчас в теме
Текущий порт отлачика tcp://srv1c:1562.

Как поменять текущий порт отладчика ?
16. Александр Журавлев (apostal86) 182 19.09.17 16:14 Сейчас в теме
(15) как минимум он устанавливается автоматически отладчиком. Иначе только менять диапазон в настройках "Конфигуратор" - "Отладка" - "Подключение". В открывшейся форме "Параметры отладки" кнопка снизу слева "Настройка" - регулировка диапазона используемых для отладки портов. Но какой порт платформа займет в каждом отдельном случае - ее усмотрение, будет занимать по порядку не занятые.
18. Роман Строганов (stroganov_ru) 33 21.09.17 18:02 Сейчас в теме
Не благодарите
Прикрепленные файлы:
Оставьте свое сообщение