Режим отладки сервера 1С в Linux: ключ -debug, журнал, дампы
Содержание
Чтобы включить отладку на сервере 1С под Linux, агент сервера ragent нужно перезапустить с ключом -debug. В systemd это делается через переопределение юнита службы, в старой схеме с init.d — параметром SRV1CV8_DEBUG=1 в файле настроек службы. После перезапуска в Конфигураторе появятся серверные предметы отладки, и точки останова в серверных процедурах начнут срабатывать.
Типичная ситуация: разработчик ставит точку останова в модуле объекта, проводит документ из клиента, а отладчик молчит. Файловая база на ноутбуке отлаживается без вопросов, а серверная на Linux — нет. Причина почти всегда одна: кластер запущен без режима отладки. Если же нужен не отладчик кода, а диагностика зависшего rphost, пригодятся технологический журнал, strace и GDB.
Подготовка сервера: права, версия платформы, способ запуска службы
Перед правкой конфигурации службы выясните три вещи.
🔍 Как запущен сервер. Начиная с платформы 8.3.21 сервер под Linux ставится как юнит systemd, имя юнита содержит номер версии. В более ранних установках используется скрипт /etc/init.d/srv1cv83. Проверка:
systemctl list-units --type=service | grep -i 1cv8
ls /etc/init.d/ | grep -i 1cv8
🔍 С какими ключами работает агент сейчас. Посмотрите командную строку процесса:
ps -eo pid,user,args | grep [r]agent
Если в строке уже есть -debug, режим включён, и проблема в другом (порты, протокол, настройки Конфигуратора).
🔍 Права. Процессы ragent, rmngr и rphost работают от пользователя usr1cv8 (группа grp1cv8). Для правки юнита и перезапуска службы нужен root или sudo. Для strace и gdb — тоже root: обычный пользователь не сможет подключиться к
чужому процессу.
Проверьте ограничение ptrace в ядре:
cat /proc/sys/kernel/yama/ptrace_scope
Значение 0 или 1 подходит для работы под root. Значение 3 запрещает подключение к процессам совсем — до перезагрузки его не снять.
Перезапуск службы сервера 1С обрывает все сеансы пользователей и фоновые задания. Делайте это вне рабочего времени или после предупреждения пользователей.
Включение режима отладки сервера 1С: ключ -debug для ragent
Если служба работает через systemd
Сначала посмотрите текущий юнит целиком:
systemctl cat srv1cv8-8.3.xx.xxxx@default.service
Подставьте точное имя из вывода systemctl list-units. В юнитах новых версий ключи запуска собираются из переменных окружения Environment=, среди них есть переменная для режима отладки. Если она есть, достаточно задать её в переопределении:
sudo systemctl edit srv1cv8-8.3.xx.xxxx@default.service
В открывшемся редакторе:
[Service]
Environment=SRV1CV8_DEBUG=-debug
Если переменной в юните нет, переопределите строку запуска целиком. Сначала очистите исходную ExecStart=, затем скопируйте её из systemctl cat и допишите -debug:
[Service]
ExecStart=
ExecStart=/opt/1cv8/x86_64/8.3.xx.xxxx/ragent -daemon -port 1540 -regport 1541 -range 1560:1591 -debug
Правка через systemctl edit лежит в отдельном каталоге .d и переживает обновление пакета. Не редактируйте исходный файл юнита напрямую: при обновлении платформы его перезапишут.
Применение:
sudo systemctl daemon-reload
sudo systemctl restart srv1cv8-8.3.xx.xxxx@default.service
ps -eo args | grep [r]agent
В выводе последней команды должен появиться -debug.
Если служба работает через init.d
Скрипт srv1cv83 читает настройки из файла /etc/default/srv1cv83 (Debian, Ubuntu) или /etc/sysconfig/srv1cv83 (RHEL-подобные системы). Найдите строку с SRV1CV8_DEBUG, раскомментируйте её и задайте 1:
SRV1CV8_DEBUG=1
Затем перезапустите службу: sudo /etc/init.d/srv1cv83 restart.
Протокол отладки: TCP или HTTP
У отладки 1С два протокола. Ключ -debug без уточнений включает TCP. Для HTTP-отладки добавляют -http: -debug -http. Протокол на сервере и в Конфигураторе должен совпадать.
| Протокол | Ключи ragent | Что открыть в файрволе | Когда выбирать |
|---|---|---|---|
| TCP | -debug или -debug -tcp | диапазон рабочих процессов, по умолчанию 1560–1591 | Конфигуратор в той же сети, что и сервер |
| HTTP | -debug -http | порт сервера отладки, по умолчанию 1550 | сервер за NAT, отладка через один порт, EDT |
Открыть порты в ufw:
sudo ufw allow from 10.0.0.0/24 to any port 1560:1591 proto tcp
Разрешайте доступ только из сети разработчиков, а не со всего интернета.
Подключение из Конфигуратора
- Откройте базу в Конфигураторе.
- В
Сервис → Параметрына вкладке отладки выберите протокол, который совпадает с ключом сервера. - Запустите клиент кнопкой «Начать отладку» (F5) или подключитесь к уже открытому сеансу через меню
Отладка → Подключение. - В окне подключения включите автоматическое подключение серверных предметов: серверный контекст, фоновые задания, HTTP-сервисы — что нужно.
- Поставьте точку останова в серверной процедуре и выполните действие в клиенте.
Если точка останова стоит в процедуре с &НаСервере, а в списке предметов отладки нет строки сервера, — сервер всё ещё работает без -debug. Перепроверьте командную строку ragent.
На рабочем сервере режим отладки оставлять нельзя. Остановка на точке замораживает сеанс пользователя, а любой, у кого есть Конфигуратор и сетевой доступ к порту, может подключиться к серверному контексту. Включили на время разбора — уберите ключ и перезапустите службу.
Технологический журнал 1С на сервере Linux
Отладчик показывает выполнение кода. Если же нужно понять, почему тормозит или падает rphost, первым инструментом идёт технологический журнал (ТЖ). Он не требует перезапуска сервера и ключа -debug.
Настройки лежат в файле logcfg.xml. На Linux его кладут в каталог conf платформы: общий /opt/1cv8/conf/ или каталог конкретной версии /opt/1cv8/x86_64/8.3.xx.xxxx/conf/. Сервер перечитывает файл примерно раз в минуту.
Минимальная настройка для поиска исключений и долгих вызовов:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="/var/log/1c/tj" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="CALL"/>
<gt property="duration" value="1000000"/>
</event>
<property name="all"/>
</log>
<dump create="true" location="/var/log/1c/dumps" type="3"/>
</config>
Подготовьте каталоги и права:
sudo mkdir -p /var/log/1c/tj /var/log/1c/dumps
sudo chown -R usr1cv8:grp1cv8 /var/log/1c
📌 history="24" — хранить 24 часа логов, старые удаляются сами.
📌 В актуальных версиях 8.3 длительность (duration) в журнале — в микросекундах, так что 1000000 отбирает вызовы дольше 1 секунды.
📌 Элемент <dump> включает создание дампов при аварийном завершении процессов.
Полный журнал (все события без фильтров) на нагруженном сервере пишет гигабайты в час. Фильтруйте по событиям и длительности и следите за свободным местом через df -h.
Трассировка системных вызовов rphost через strace
Когда rphost «висит» без нагрузки на процессор, ТЖ часто молчит: процесс ничего не выполняет, он чего-то ждёт. strace показывает, на каком системном вызове он застрял.
Найдите нужный рабочий процесс:
pgrep -a rphost
top -p $(pgrep -d, rphost)
Подключитесь к нему на 30 секунд и запишите трассу в файл:
sudo timeout 30 strace -f -tt -T -p <PID> -o /tmp/rphost.strace
-f— следить за всеми потоками процесса, уrphostих десятки;-tt— время с микросекундами;-T— сколько длился каждый вызов;-e trace=network,file— сузить вывод до сети и файлов, если трасса слишком большая.
Что искать в результате:
- 🌐 долгие
poll,recvfrom,readна сетевом сокете — процесс ждёт ответа СУБД или другого сервера; - 🔒
futexс большим временем — ожидание блокировки между потоками; - 📁
open/openatс ответомEACCESилиENOENT— нет прав или нет файла (часто временный каталог или каталог ТЖ); - 🔁 одинаковые вызовы тысячами подряд — цикл с ошибкой.
Номер сокета из трассы сопоставьте с соединением через ss -tnp | grep <PID> — так видно, к какому адресу и порту ушёл запрос.
strace заметно замедляет процесс, к которому подключён. На рабочем сервере держите его считанные секунды, а не часами.
Дампы памяти rphost и разбор в GDB
Дамп нужен в двух случаях: процесс падает (нужен посмертный снимок) или процесс завис (нужен снимок состояния без остановки).
Разрешить создание core-файлов
Для службы systemd лимит задаётся в том же переопределении юнита:
[Service]
LimitCORE=infinity
Куда пишется файл, определяет /proc/sys/kernel/core_pattern. Если там стоит обработчик systemd-coredump, дампы смотрят командой:
coredumpctl list rphost
coredumpctl dump <PID> -o /var/log/1c/dumps/rphost.core
Снять дамп с работающего процесса
sudo gcore -o /var/log/1c/dumps/rphost <PID>
Утилита входит в пакет gdb. Процесс на время снятия дампа останавливается: на рабочем процессе с 10–20 ГБ памяти это десятки секунд, пользователи этого процесса в это время ждут.
Что посмотреть в GDB
gdb /opt/1cv8/x86_64/8.3.xx.xxxx/rphost /var/log/1c/dumps/rphost.<PID>
(gdb) info threads
(gdb) thread apply all bt
Отладочных символов платформы у вас нет, поэтому внутренние функции 1С в стеке будут без имён. Зато видны системные библиотеки: libpq (ожидание PostgreSQL), libssl, libc, libstdc++. Если падение или зависание стабильно приходится на одну стороннюю библиотеку, это уже ответ: смотрите её версию и совместимость с дистрибутивом.
Сам дамп, вывод thread apply all bt и версию платформы прикладывают к обращению в поддержку 1С или к партнёру — без этого падение rphost там не разбирают.
Автоматический сбор диагностики при зависании
Зависание редко ждёт, пока администратор подключится. Удобнее держать готовый скрипт, который за один запуск соберёт всё нужное.
#!/bin/bash
# /usr/local/bin/1c-diag.sh — снимок состояния рабочих процессов 1С
OUT=/var/log/1c/diag/$(date +%Y%m%d-%H%M%S)
mkdir -p "$OUT"
ps -eo pid,ppid,user,%cpu,%mem,rss,etime,args | grep -E '[r]agent|[r]mngr|[r]phost' > "$OUT/ps.txt"
ss -tnp > "$OUT/sockets.txt"
free -m > "$OUT/memory.txt"
df -h > "$OUT/disk.txt"
for PID in $(pgrep rphost); do
timeout 10 strace -f -tt -T -p "$PID" -o "$OUT/strace.$PID" 2>/dev/null
gdb -p "$PID" -batch -ex "thread apply all bt" > "$OUT/bt.$PID.txt" 2>&1
done
tar -czf "$OUT.tar.gz" -C "$(dirname "$OUT")" "$(basename "$OUT")" && rm -rf "$OUT"
Права и запуск:
sudo chmod 700 /usr/local/bin/1c-diag.sh
sudo /usr/local/bin/1c-diag.sh
Скрипт сознательно не снимает полный дамп каждого процесса: стеки через gdb -batch занимают килобайты, а gcore — гигабайты. Полный дамп снимайте вручную для одного подозрительного rphost.
Можно привязать скрипт к событию. Например, запускать по cron раз в минуту проверку, отвечает ли база, и при сбое вызывать сбор. Проверку отклика делайте лёгким HTTP-запросом к опубликованному сервису базы, если он есть.
Добавьте в скрипт удаление архивов старше 7 дней (find /var/log/1c/diag -mtime +7 -delete), иначе диск забьётся за пару недель частых сбоев.
Как читать результаты и где чаще всего ошибаются
Связка инструментов выглядит так: ТЖ показывает, какой вызов 1С был долгим или упал; strace — чего ждал процесс; стек из GDB — в какой библиотеке он стоит. Сводите данные по времени: момент события в ТЖ, метку в трассе, время снятия стека.
ps -eo args | grep [r]agent: нет -debug — служба перезапущена без ключа или правка сделана не в том юните. Есть -debug — сравните протокол TCP/HTTP на сервере и в настройках Конфигуратора.nc -zv <сервер> 1560.systemctl edit осталось у старого юнита — повторите его для нового.usr1cv8 на каталог из location, ошибка в XML или файл лежит не в том каталоге conf. Проверьте права через sudo -u usr1cv8 touch /var/log/1c/tj/test.root или ограничение ptrace_scope. Проверьте значение в /proc/sys/kernel/yama/ptrace_scope.LimitCORE не задан в юните или core_pattern отправляет дампы в обработчик, который их не хранит. Проверьте coredumpctl list.Ещё две ошибки, которые встречаются постоянно:
- ❌ Оставленный режим отладки. Включили на разбор, забыли выключить. Через месяц пользователи жалуются на «замирание» сеансов, когда кто-то из разработчиков поставил точку останова в общем модуле.
- ❌ Полный ТЖ без фильтров «на всякий случай». Раздел с логами заполняется за ночь, сервер 1С перестаёт писать временные файлы, и проблема, ради которой включали журнал, становится больше.
Частые вопросы
Можно ли включить отладку только для одной базы кластера?
-debug действует на весь сервер, то есть на все базы кластера. Ограничить можно только тем, к каким базам у разработчиков есть доступ в Конфигураторе.Нужен ли перезапуск сервера, чтобы включить технологический журнал?
logcfg.xml примерно раз в минуту. Перезапуск нужен только для смены ключей запуска ragent, в том числе -debug.Влияет ли режим отладки на скорость работы, если никто не подключён?
Как отлаживать фоновые задания на сервере Linux?
-debug, затем в Конфигураторе Отладка → Подключение и автоматическое подключение фоновых заданий. Точка останова сработает при следующем запуске задания.Подойдёт ли эта настройка для отладки из EDT?
-debug -http и открывайте порт сервера отладки.