Утилита для локальной отладки задач
yc-invoke — утилита для запуска задач из Яндекс Контеста локально на устройстве автора задачи. Она позволяет:
- Запускать на проверку локальные файлы решения, в том числе на ограниченном количестве тестов.
- Отлаживать решения с помощью механизмов удаленного дебага.
- Получить доступ к терминалу контейнера на различных шагах проверки задачи.
Важно
Утилита yc-invoke не является полноценной репликой или заменой системы Яндекс Контест на локальном компьютере. Мы рекомендуем использовать ее исключительно как дополнительный инструмент создания и отладки задач на нашей платформе.
Больше про ограничения утилиты см. ниже.
Требования к системе и установка
Системные требования
- Windows 10 или 11
- Процессор с архитектурой x86-64
- 4 ГБ свободной оперативной памяти
- Docker Desktop, если условия лицензии позволяют использование, с WSL Backend
Также возможно использование Docker Engine внутри выбранного и установленного через WSL дистрибутива Linux. В этом случае yc-invoke устанавливается внутрь WSL по инструкции для Linux.
- GNU/Linux с ядром версии 5.0 и новее
- Процессор с архитектурой x86-64
- 2 ГБ свободной оперативной памяти
- Docker Engine
- curl
- macOS 13 и новее
- Процессор Intel или Apple Silicon
- 4 ГБ свободной оперативной памяти
- Установленный Docker (один из вариантов установки):
- Docker Desktop, если условия лицензии позволяют использование, с Docker VMM
- Colima c установленными через Homebrew пакетами docker и qemu
- curl
Установка и обновление
Выполните в терминале команду, чтобы установить последнюю версию утилиты:
powershell -ExecutionPolicy ByPass -c "irm https://yastatic.net/s3/contest/yc-invoke/install.ps1 | iex"
curl -fsSL https://yastatic.net/s3/contest/yc-invoke/install.sh | sudo sh -
Для обновления повторно выполните команду установки.
Настройка и удаление
Для настройки утилиты локальной отладки выполните в терминале следующую команду:
yc-invoke configure
После ее выполнения автоматически откроется браузер. Подтвердите доступ и введите код из браузера в терминал для аутентификации.
Удаление
rmdir /s /q %appdata%/yc-invoke
rmdir /s /q %localappdata%/yc-invoke
sudo rm /usr/local/bin/yc-invoke
rm -rf "~/.config/yc-invoke"
rm -rf "~/.cache/yc-invoke"
sudo rm /usr/local/bin/yc-invoke
rm -rf "~/Library/Application Support/yc-invoke"
rm -rf "~/Library/Caches/yc-invoke"
Локальная отладка задачи
Для того чтобы провести локальную отладку, вам понадобится:
- Установленная и настроенная утилита локальной отладки;
- ID настроенной в Яндекс Контесте задачи, для которой у вас есть права на редактирование;
- ID компилятора, с помощью которого будет отправляться решение в задачу.
Запуск утилиты для отладки:
yc-invoke run PROBLEM_ID COMPILER_ID PATH_TO_SOLUTION
PROBLEM_ID— ID задачи в виде трех буквенно-цифровых последовательностей, разделенных/.COMPILER_ID— ID компилятора.PATH_TO_SOLUTION— путь к файлу вашего решения.
Пример команды: yc-invoke run 12345/2000-01-01/abCdefGjkL gcc_cpp20 solution.cpp.
Подсказку по вызову для конкретной задачи и компилятора можно посмотреть в разделе Тесты и решения.
Локальные файлы задачи
Вы можете указать локальную директорию, в которой частично или полностью лежит файловая система задачи. Если в этой директории будет обнаружен какой-то файл, необходимый для запуска (тест, чекер и т.д.), он будет использован вместо файла из задачи, загруженного через панель администратора.
Для этого при запуске утилиты используйте флаг --problem-files и укажите путь к директории:
yc-invoke run 12345/2000-01-01/abCdefGjkL gcc_cpp20 solution.cpp --problem-files ./some-problem-files
Запуск на выбранных тестах
Когда нужно запустить задачу на ограниченном количестве тестов, можете указать маску, по которой они будут выбраны.
Для этого при запуске утилиты используйте флаг --tests с указанием желаемых тестов:
yc-invoke run 12345/2000-01-01/abCdefGjkL gcc_cpp20 solution.cpp --tests tests/{01-05,07}
Синтаксис написания масок соответствует выражениям, используемым в настройке шаблона входного файла Наборов тестов.
Доступ в сеть
Чтобы включить доступ в интернет во время локального запуска задачи, используйте флаг --network:
yc-invoke run 12345/2000-01-01/abCdefGjkL gcc_cpp20 solution.cpp --network
Важно
Запуск утилиты в этом режиме рекомендуется только для работы отладчика или для отладки ваших скриптов. Во время обычного запуска задачи в системе Яндекс Контест доступа к сети нет и не будет в силу ограничений платформы.
Терминал контейнера
Вы можете подключиться к терминалу контейнера, чтобы проверить, какие именно файлы и окружение вам доступно. Для этого добавьте флаг --pause к команде yc-invoke run.
После создания изолированного контейнера, но перед запуском каждого процесса (компиляции, исполнения, чекера) процесс тестирования будет приостановлен и утилита предоставит вам команду для подключения к контейнеру:
$ yc-invoke run 12345/2000-01-01/abCdefGjkL gcc_cpp20 solution.cpp --pause
⏸︎ Compiling solution
Open container shell: docker exec -it debbfc022e6b2ea2ade2806ef458c904d6e3ff3a72163c01ee64916903be4d99 bash
'c' to continue • Ctrl-C to abort
Выполните эту команду в соседнем терминале, чтобы подключиться к контейнеру. Вы можете нажать кнопку c, чтобы запустить соответствующий процесс. Контейнер завершится сразу после завершения этого процесса — терминал так же закроется в этот момент.
Примечание
Обратите внимание, что к вашим действиям в терминале также применяется общий лимит на число процессов, доступных в системе. В Make-задачах обычно это не является проблемой, но вы можете столкнуться с ошибками вида fork: Resource unavailable в обычных задачах.
Отладка решения
Вы можете подключиться к контейнеру с отладчиком, чтобы найти ошибку в решении или дополнительных файлах.
Рекомендуется использовать механизмы удалённого дебага в вашем языке программирования. Дополнительные флаги компиляции вы можете добавить только в Make-задачи, где есть возможность управлять флагами компилятора.
Чтобы сетевой порт стал доступен, при запуске утилиты используйте флаг --expose. Например, --expose 8000 предоставит на порту 8000 вашего ПК доступ к порту 8000 контейнера.
Также вы можете:
- Открыть несколько портов:
--expose 8000,9000; - Пробросить порт на порт вашего ПК с другим номером:
--expose 8000:9000предоставит на порту 8000 вашего ПК доступ к порту 9000 контейнера; - Пробросить UDP-порт:
--expose 8000/udp
При запуске Java передайте флаг -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8000. Например, java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -cp main.jar ru.your.solution.MainClass.
Добавьте к yc-invoke run флаг --expose 8000.
Подключитесь в вашей IDE или отладчике к удалённому серверу 127.0.0.1:8000. Решение будет запущено только после того, как вы явно это подтвердите в отладчике.
Добавьте при запуске Node.js флаг --inspect-brk=0.0.0.0:9229.
Добавьте к yc-invoke run флаг --expose 9229.
Подключиться к отладчику вы можете через инструменты разработчика в Chrome и через вашу IDE, используя IP-адрес 127.0.0.1 и порт 9229. Подробнее — в документации Node.js.
Для других языков программирования отладка происходит аналогично. Воспользуйтесь руководством разработчика соответствующего языка, чтобы найти нужные настройки.
Если в вашем языке нет решения для удалённой отладки, вы можете выводить данные в стандартный поток ошибок (stderr). Такой вывод показывается в терминале при исполнении. Флаг -v при запуске утилиты предотвратит очистку вывода после завершения процесса.
При возникновении проблем
Если в утилите произошла какая-то ошибка, повторите запуск, добавив флаг -v. Этот флаг увеличивает количество выводимой информации:
yc-invoke run 12345/2000-01-01/abCdefGjkL gcc_cpp20 solution.cpp -v
Подробный лог хранится в системной директории приложения:
- Windows:
%AppData%\yc-invoke\yc-invoke.log. - Linux:
~/.config/yc-invoke/yc-invoke.log. - macOS:
~/Library/Application Support/yc-invoke/yc-invoke.log.
Ошибки и нерешаемые проблемы при локальном запуске
Если самостоятельно разобраться в ошибке не представляется возможным, выполните команду yc-invoke debug. Она сохранит отладочную информацию в текстовый файл в вашей текущей директории.
После этого напишите нам в Службу поддержки. В сообщении подробно опишите свою проблему, а также:
- Прикрепите полный вывод утилиты или скриншот, в котором будет видно команду запуска и всё, что вывела утилита до ошибки.
- Прикрепите файл, сгенерированный командой
yc-invoke debug.
Ограничения в работе утилиты
-
Время исполнения задачи через утилиту измеряется с меньшей точностью, чем при обычном запуске задачи в системе Яндекс Контест. Запуски одной и той же задачи с одинаковыми настройками могут приводить к разным результатам.
В случае запуска на ARM-процессорах решение запускается с использованием программной виртуализации, и это может приводить к разнице во времени с Контестом в десятки раз.
-
Утилита некорректно определяет расход памяти, составляющий менее 10 МБ.
-
При приближении к лимиту памяти и аллокации небольшими фрагментами памяти вместо моментального выставления вердикта Memory limit exceeded (ML) решение может зависнуть перед падением (в частности, получить вердикты Time-limit exceeded (TL) или Idleness limit exceeded (IL) вместо ML). Это особенность Linux и cgroups.
Аналогично, при превышении лимита на количество процессов система Яндекс Контест аварийно завершает решение; а утилита вместо этого возвращает ошибку системным вызовам
fork(..)и аналогам, в связи с чем решение может упасть с какой-то собственной ошибкой или даже продолжить работу. -
Поддерживаются только
TESTLIB_EXITCODE_CHECKER,EJUDGE_EXITCODE_CHECKERи стандартные чекеры. Нет поддержки чекеров типаTESTLIB_CHECKER(XML-вывод на основеtestlib.pas). -
Не поддерживаются чекеры без указания компилятора (Legacy-запуск с шебангом).
-
Не поддерживаются «недокерные» компиляторы, а также компиляторы, собранные поверх Ubuntu 18.04 и 20.04.
-
Не гарантируется изоляция запускаемых процессов от хост-системы: запускать недоверенный код не рекомендуется.
Ограничения, которые будут устранены в последующих релизах
- Поддержано ограниченное множество компиляторов: GCC (C17, C23, C++20, C++23), Clang (C++20, C++23), C# (.NET 8), Bash 5, Go, JDK 22, Node.js 20, Node.js 22, PyPy 3, Python 3.13, Swift 6, TypeScript 5.8 и Make-аналоги.
- Не запускается постпроцессор.
- Поддержан только тип задачи
PROBLEM_WITH_CHECKER. - Не поддержано ограничение на объём вывода.
- Возможен некорректный подсчёт количества потоков, когда их меньше 10.