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

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

Преамбула

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

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

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

Анализ

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

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

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

<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:v8clientlogs" 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=srcDataExchangeServerImpl.cpp'
30:25.862003-0,EXCP,1,process=1cv8,ClientID=0,Exception=NetDataExchangeException,Descr='server_addr=any:1561 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=srcDataExchangeServerImpl.cpp'
30:25.862006-0,EXCP,1,process=1cv8,ClientID=0,Exception=NetDataExchangeException,Descr='server_addr=any:1562 descr=10048(0x00002740): Обычно разрешается только одно использование адреса сокета (протокол/сетевой адрес/порт). line=261 file=srcDataExchangeServerImpl.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=srcDataExchangeTcpClientImpl.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=srcDataExchangeTcpClientImpl.cpp'

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

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

MaxUserPort

При соединение по TCP/IP открывается сокет и выбирается динамический порт. По умолчанию, диапазон динамических портов от 1024 по 5000. Увеличиваем до максимума.
Key: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters
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_MACHINESYSTEMCurrentControlSetServicesTcpipParameters
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С отладка перестала отваливаться.

20 Comments

  1. stas1976

    где тут лайк ставить :))

    Reply
  2. login1020

    Я так понимаю, что это рекомендации к клиент-серверной версии, а что делать при такой же беде с файловой базой?

    Reply
  3. CratosX

    (2) а какая именно у вас беда? На файловой не может быть точно такой же

    Reply
  4. login1020

    Однажды, пропала отладка для всех имеющихся баз на локальном пк, чистка кэша, отключение антивируса, брендмауэра не помогла. Впоследствии отладка сама включилась через несколько дней, из значимых событий на пк в эти дни было только обновление Skype…

    Reply
  5. tormozit

    (4) Кончился диапазон портов для предметов отладки.

    Reply
  6. login1020

    (5) как это проверить можно было?

    Reply
  7. mickey.1cx

    (2) без разницы, техжурнал собирается для клиента 1С

    Reply
  8. v3rter

    Единственное, что смущает — попадание в зарезервированный диапазон динамических (эфемерных ) портов 49152 — 65535.

    Может лучше сначала Range: 5000 to 49000 ?

    Reply
  9. mickey.1cx

    (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. и использоваться не должны (для других целей). Динамические порты — должны регистрироваться в международном комитете для использования новыми службами широкого применения. Эфемерные порты — это порты «оставленные» разработчикам для использования в своих частных задачах (где попало…). Никаких гарантий об неконфликтности эфемерных портов в условиях эксплуатации, естественно, не даётся.

    В этом контексте использование «эфемерного» диапазона не должно привести к каким то проблемам.

    Можно более подробно разобрать, что вас смущает. Полагаю, полезно будет для всех.

    Reply
  10. marsohod

    Странно, у меня по умолчанию такие параметры установлены (только в шестнадцатиричной системе исчисления). Win 7 x64.

    Может, стоит уточнить для каких ОС этот рецепт предназначен?..

    Reply
  11. mickey.1cx

    (10) по умолчанию этих параметров в соответствующих разделах реестра нет. В вашем случае, когда добавляли эти параметры, перед вводом значений не переключили предварительно систему исчисления в десятичную. При создании в форме ввода значения параметра по умолчанию установлена шестнадцатиричная, что объясняет ваши значения.

    Reply
  12. VirDim

    Применил параметры реестра, всё равно отладка не работает. Отлаживаю вебсервис (на клиенте и сервере отладка работает). На локальном компьютере iis и конфигуратор, на сервере сервер 1с и sql. Фаерволы, антивирусы отключены. В публикации прописал адрес отладки (в разных вариациях пробовал) из настроек отладки. Автоматическое подключение вебсервисов стоит. В тех журнале на клиенте такое (см скрин). Делал netsh winsock reset — не помогло. Есть какие-то мысли?

    P.S. Отладка вчера работала, а сегодня отвалилась. Перезагружал и сервер и свою машину по нескольку раз, ничего не помогает.

    Reply
  13. mickey.1cx

    (12) попробуйте сделать дополнительно восстановление первоначальной конфигурации winsock

    http://www.cyberforum.ru/networks-faq/thread1102068.html

    Reply
  14. VirDim

    (13) Да, я делал так, как было в инструкции, но это всё равно не помогло. В итоге, после n-ной попытки переопубликации вебсервиса и перезапуска его, отладка удивительным образом заработала. Шайтан…

    Reply
  15. Nigmatul

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

    Как поменять текущий порт отладчика ?

    Reply
  16. apostal86

    (15) как минимум он устанавливается автоматически отладчиком. Иначе только менять диапазон в настройках «Конфигуратор» — «Отладка» — «Подключение». В открывшейся форме «Параметры отладки» кнопка снизу слева «Настройка» — регулировка диапазона используемых для отладки портов. Но какой порт платформа займет в каждом отдельном случае — ее усмотрение, будет занимать по порядку не занятые.

    Reply
  17. Green2

    (1)>где тут лайк ставить :))

    В самом верху страницы есть звездочка, это и есть лайк

    Reply
  18. stroganov_ru

    Не благодарите

    Reply
  19. nkp14108

    А почему 32, а не 64

    Reply
  20. triviumfan

    Сколько же я мучался.. и на всех последних платформах.

    Решение принял другое — переход на отладку по http протоколу. Ничего не «отваливается».

    Жаль, что раньше эту статью не увидел.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *