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

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

Преамбула

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

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

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

Анализ

Текущий порт отлачика 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 не будет опубликован. Обязательные поля помечены *