Watchdog не гадает и не смотрит на картинку экрана. Он опрашивает процесс приложения по кругу и сверяет его с четырьмя правилами. Ниже — точные пороги, значения по умолчанию и то, что Watchdog при этом записывает: график памяти, архив логов приложения и собственный журнал.
Как поставить Watchdog на стенд и настроить эти пороги — Установка и настройка. Как раздавать новые версии билда — Обновление билда через Яндекс.Диск.
Watchdog работает тиками. На каждом тике он ищет процесс по имени, снимает показатели — PID, время работы, CPU, память, — проверяет время планового перезапуска и прогоняет правила перезапуска.
| Параметр | По умолчанию | Где настраивается |
|---|---|---|
| Интервал опроса | 10 секунд | Настройки → Мониторинг → «Интервал опроса (сек)» |
| Начальная задержка после запуска | 30 секунд | Настройки → Мониторинг → «Начальная задержка (сек)» |
Начальная задержка — это «дайте приложению загрузиться»: в эти секунды проверки «не отвечает» и «зависание по CPU» не применяются, чтобы Watchdog не убил сборку во время долгой загрузки уровня.
Если приложение уже работает, когда Watchdog стартует — например, оно само прописано в автозапуске Windows, — второй экземпляр не запускается. Watchdog подхватывает работающий процесс и дальше следит за ним. Когда на машине несколько наблюдаемых приложений с одинаковым именем процесса, «своё» определяется по полному пути к exe.
Если процесс запущен с повышенными правами и его показатели прочитать нельзя, проверки «не отвечает» и «зависание по CPU» намеренно пропускаются: Watchdog не убивает то, что не может измерить.
| Причина | Как Watchdog это видит | Настройка | По умолчанию |
|---|---|---|---|
| Приложения нет | Процесс с нужным именем не найден | всегда работает | — |
| Не отвечает | Системный признак «процесс не реагирует» — то самое «Программа не отвечает» | «Перезапускать при отсутствии ответа» | включено |
| Завис по CPU | Суммарное процессорное время процесса не изменилось вообще за окно проверки | «Перезапускать при неизменном CPU (детект зависания)», «Окно проверки CPU (сек)» | включено, окно 5 секунд |
| Плановое время | Наступило время ежедневного перезапуска | «Ежедневный плановый перезапуск» + время | включено, 00:01 |
Правила проверяются по порядку, и первое сработавшее решает.
Приложения нет. Watchdog запускает его: путь к exe, рабочая папка (пусто = папка exe) и аргументы — из настроек приложения. Дальше начинается начальная задержка.
Не отвечает. Причина в журнале выглядит так: «PID 4812 не отвечает».
Завис по CPU — это «замороженный цикл»: приложение формально живо и даже «отвечает», но встало намертво и перестало потреблять процессорное время. Причина в журнале: «CPU процесса PID 4812 не изменился за 5 с». Сэмпл сбрасывается при смене процесса и при недоступных показателях — сравнение «через разрыв» не делается. Реальное окно сравнения не меньше заданного, но кратно интервалу опроса: проверка выполняется на тике.
Плановое время. Подробности и оговорки — в разделе ночной перезапуск.
Чего среди правил нет: Watchdog не следит за картинкой на экране и не определяет чёрный экран как таковой. Он видит только, есть ли процесс, отвечает ли он, тратит ли процессорное время и сколько ест памяти. Правил «перезапустить, если окно ушло с экрана» и «перезапустить, если лог не растёт N минут» в продукте нет.
Бесконечно перезапускать сборку, которая падает на старте, бессмысленно. Watchdog останавливается и зовёт человека.
| Параметр | По умолчанию | Где настраивается |
|---|---|---|
| Сколько перезапусков включают защиту | 3 | только в config.json, monitoring.crashLoopGuard.maxRestartsPerWindow |
| Окно, за которое они считаются | 5 минут | только в config.json, monitoring.crashLoopGuard.windowMinutes |
Когда порог набран: мониторинг блокируется, статус меняется на «Петля рестартов», в журнал идёт запись «петля рестартов: 3 перезапуска за 5 мин», а при включённой почте письмо уходит сразу, не дожидаясь сводки. Снимается только вручную — кнопкой ▶ / «Возобновить».
| Событие | Считается? |
|---|---|
| Сбой — ненулевой код возврата, при любом времени работы | да |
| Принудительное завершение Watchdog при зависании | да |
| Процесс пропал между опросами | да |
| Штатный выход с кодом 0 раньше 10 секунд после запуска | да — сборка, гаснущая на стартовой ошибке, это настоящая петля |
| Штатный выход после 10 секунд и больше — например, приложение закрыл человек | нет |
| Перезапуск по команде оператора | нет |
| Плановый ночной перезапуск | да |
Порог «10 секунд» зашит в продукт и в настройки не выносится. До версии 1.1.3 в копилку шёл каждый запуск подряд, включая ручное закрытие приложения, — с 28 августа 2026 это исправлено.
Пауза «петля рестартов» переживает перезапуск Watchdog: она записывается вместе с причиной. После перезагрузки стенд сам не поднимется, пока оператор не возобновит мониторинг — если только не включена галочка «Запускать мониторинг при старте Watchdog».
Что делать при этом статусе: разобрать причину по архиву логов приложения, починить билд, затем снять паузу кнопкой ▶.
Панель «Память процесса» на вкладке «Состояние» отвечает на вопрос «течёт ли память у билда» числом, а не ощущением.

Что меряется. Две линии, снимаются на каждом тике:
Складывать их нельзя — это два взгляда на одну память.
Тренд. В шапке панели — текущее значение private крупно и наклон за текущий сеанс: ↗ +38 МБ/ч за сеанс, ↘ −38 МБ/ч за сеанс или → стабильно за сеанс, если наклон меньше 1 МБ/ч в любую сторону.
Диапазоны. Час · Сутки · Неделя · Всё. По умолчанию — Сутки, выбор запоминается. «Час» рисует сырые тики; «Сутки» и шире — линию средних с полупрозрачным коридором минимума и максимума.
Маркеры — вертикальный пунктир: выход процесса (красный при сбое, серый при штатном или ручном завершении, в подсказке — время и причина) и установка новой версии билда («обновление до 1.4.3»).
Подсказка при наведении показывает 14:32 · Private: 2,4 ГБ · Working set: 2,1 ГБ и строку Билд: 1.2.3. На агрегатах значения выводятся как «среднее (мин–макс)». Над разрывом линии подпись «процесс не работал». На сенсорном экране тап работает как наведение.
Где хранится:
| Уровень | Что | Горизонт |
|---|---|---|
| Оперативная память | сырые тики | 2 часа, до 8192 точек |
| Диск | поминутные значения мин/среднее/макс по обеим линиям, файл projects\<id>\metrics\memory-ГГГГ-ММ.csv | 60 дней, старые файлы удаляются сами |
В каждой строке CSV есть колонка с версией билда, активной в момент замера. Файл годится как выгрузка «как есть» — открывается в Excel и любом редакторе таблиц.
Кнопка «Очистить» справа от диапазонов удаляет буфер и CSV только своей вкладки и спрашивает подтверждение «Удалить всю историю памяти?». Сбор продолжается со следующего тика.
Чего панель не делает: порога-алерта по памяти нет, письма при превышении не приходит, автоматически по памяти Watchdog не перезапускает. График показывает — решение принимает человек. Панели CPU тоже нет.
Простой процесса рисуется разрывом линии, а не прямой через даунтайм. Наблюдение продолжается и когда мониторинг стоит на паузе.
Каждый раз, когда приложение завершается, его лог-файл сохраняется отдельной копией с проставленной причиной. Получается готовый багрепорт для разработчика билда.

Откуда берётся лог. Для Unity путь определяется автоматически: %USERPROFILE%\AppData\LocalLow\<Компания>\<Продукт>\Player.log. Для Unreal — свежайший *.log из папки Saved/Logs проекта рядом с exe. Для типа «Другое» автоопределения нет: путь указывается вручную или оставляется пустым.
Как называется копия. <Процесс>_ГГГГ-ММ-ДД_ЧЧ-ММ-СС_<причина>.log в папке projects\<id>\target-logs\. Рядом ложится парный файл с метаданными: процесс, время запуска и выхода, причина, код выхода, размер, признак обрезки.
Причины завершения — так они подписаны в таблице:
| Подпись | Что означает |
|---|---|
| Штатное завершение | Процесс вышел сам с кодом 0: приложение закрыли или оно завершилось корректно. Watchdog не вмешивался |
| Сбой | Процесс упал с ненулевым кодом возврата — например, 0xC0000005 (обращение к чужой памяти) или переполнение стека. В скобках — краткая причина, если её удалось определить |
| Перезапуск watchdog | Watchdog принудительно завершил процесс: зависание, плановый перезапуск или остановка из интерфейса. Конкретный повод — в скобках |
| Ручное завершение | Остановка оператором |
| Неизвестно | Процесс пропал между опросами: внешнее завершение, taskkill, перезагрузка машины |
Большие логи обрезаются. Если исходный файл больше 5 МБ, сохраняется хвост, а в начало вставляется строка === TRUNCATED — пропущено N байт исходного файла (…) ===. В таблице размер показывается как 1,2 МБ (обрезано из 48,3 МБ).
Ротация архива: до 50 файлов и не старше 30 дней. Лимиты общие для всего Watchdog, но применяются к папке каждой вкладки отдельно. Вся функция выключается в config.json (logging.logArchive.enabled), в интерфейсе выключателя нет.
Что на вкладке «Логи приложения»:
Архив ведётся и когда мониторинг стоит на паузе. Если путь к логу не задан или файла нет, архивация просто не работает — ошибок пользователю не показывается.
Как переслать лог разработчику из окна — в разделе отправить лог.
Логов три, у каждого своя роль.
| Файл | Что внутри | Для кого |
|---|---|---|
logs\watchdog.log | События: запуск, перезапуск, зависание, плановый перезапуск. Один файл на всю папку; строки вкладки идут с префиксом [<имя вкладки>] | Оператор, разбор постфактум |
logs\diagnostic.log | Внутренние предупреждения и ошибки | Разбор проблем самого Watchdog |
logs\crashes\crash_*.log | Сбои самого Watchdog | Отправка разработчику |
Живая лента — вкладка «Логи watchdog»: последние записи (до 1000) с колонкой уровня. События, не привязанные к конкретному приложению — настройки, почта, самообновление, — видны во всех вкладках с пометкой «Watchdog». Над лентой две иконки: открыть полный лог на диске и отправить журнал по почте (вторая активна только при настроенной почте).
Уровень журнала, размер файла до ротации и число хранимых файлов настраиваются только в config.json (logging.level — «Information», maxSizeMb — 10, rotatedFiles — 5). Экспорта «диагностического архива» одной кнопкой пока нет.
Отдельная опция закрывает лазейку «оператор поставил мониторинг на паузу и запустил билд руками».
«Завершать экземпляры приложения, запущенные мимо Watchdog» — Настройки → Мониторинг, по умолчанию выключено.
Когда включено, экземпляры целевого приложения, запущенные не через Watchdog — вручную из папки, ярлыком, автозапуском Windows, — завершаются на ближайшем цикле проверки. Окно Watchdog разворачивается и показывает отдельное окно «Watchdog — Посторонний запуск» поверх всего, в том числе поверх полноэкранного билда: процесс, PID, путь, время и счётчик «Повторных срабатываний: N». Окно единственное — повторы обновляют счётчик, а не плодят стопку окон.
Что важно знать:
| Подпись | Цвет | Что означает |
|---|---|---|
| Работает | зелёный | Процесс найден и здоров |
| Запускается | жёлтый | Запуск в процессе |
| Перезапуск | жёлтый | Идёт перезапуск |
| Не отвечает | красный | Процесс не реагирует |
| Ошибка | красный | Сбой в работе наблюдения |
| Петля рестартов | красный | Сработала защита от петли, мониторинг заблокирован |
| Конфликт цели | красный | Цель уже наблюдается другим приложением или экземпляром Watchdog |
| Пауза | серый | Мониторинг приостановлен |
| Остановлен | серый | Наблюдение не ведётся |
В трее при нескольких вкладках показывается худший статус, порядок «худшести»: Ошибка → Предупреждение → Пауза → Работает → Остановлен.

D:\Stands\Chess\
Watchdog.exe
config.json
logs\
watchdog.log
diagnostic.log
crashes\
projects\<id>\
metrics\memory-2026-09.csv история памяти, 60 дней
target-logs\ архив логов приложения, 50 файлов / 30 дней
update-state.json состояние обновлений этого приложения
builds\<id>\
Chess-1.4.2-9f86d0\ предыдущая версия, для отката
Chess-1.4.3-a1b2c3\ текущая
.staging\ скачивание и распаковка
Идентификатор <id> — служебный, в интерфейсе он не виден: имя и путь приложения меняются, а идентификатор нет. Всё, что лежит внутри папки Watchdog, переезжает вместе с ней на другой компьютер — см. перенос папки.

Быстрый справочник по полям config.json. Файл лежит рядом с exe и читается на лету: правка руками подхватывается без перезапуска.
| Поле | По умолчанию | Есть в интерфейсе |
|---|---|---|
monitoring.pollingIntervalSeconds | 10 | да |
monitoring.initialDelaySeconds | 30 | да |
monitoring.checkResponding | включено | да |
monitoring.hangCpuCheck.enabled | включено | да |
monitoring.hangCpuCheck.sampleWindowSeconds | 5 | да |
monitoring.killRogueProcesses | выключено | да |
monitoring.crashLoopGuard.maxRestartsPerWindow | 3 | нет |
monitoring.crashLoopGuard.windowMinutes | 5 | нет |
schedule.dailyRestartEnabled | включено | да |
schedule.time | 00:01 | да |
startup.launchWithWindows | выключено | да |
startup.forceMonitoring | выключено | да |
ui.startMinimized | включено | да |
ui.minimizeOnTargetStart | включено | да |
ui.memoryChartRange | Day | да, вкладки диапазонов |
logging.logArchive.maxFiles | 50 | нет |
logging.logArchive.maxAgeDays | 30 | нет |
logging.logArchive.maxFileSizeMb | 5 | нет |
notifications.email.smtp.port | 587 | да |
notifications.email.digest.intervalDays | 7 | да |
notifications.email.digest.dispatchTime | 09:00 | да |
Поля, которые есть в файле, но ни на что не влияют: startup.runAsAdmin и monitoring.hangLogFreshness.* — зарезервированы, поведения не меняют. Чекбокс «Очищать журнал watchdog при плановом перезапуске» сохраняется, но на журнал не действует.
Настройки, записанные более новой версией Watchdog, он не перезаписывает: при несовпадении схемы программа завершится, а причина уйдёт в diagnostic.log. Лечится обновлением Watchdog до актуальной версии.
КОНТАКТЫ
ООО «Юнидэй»
г. Саратов, ул. Бахметьевская 44/64, оф. 72
ИНН: 6454142737
КПП: 645401001
ОКВЭД: 62.01 Разработка компьютерного программного обеспечения.
Код вида деятельности: 22.01
© UNIDAY, 2014-2025
ООО «Юнидэй»
г. Саратов, ул. Бахметьевская 44/64, оф. 72
ИНН: 6454142737
КПП: 645401001
ОКВЭД: 62.01 Разработка компьютерного программного обеспечения.
Код вида деятельности: 22.01