Отладка
Как отлаживать ядро Plugify, языковые модули и нативные плагины в запущенной игре с символами, Visual Studio, GDB и LLDB.
Эта страница об отладке ядра, языкового модуля или нативного плагина внутри запущенной игры, например сервера Counter-Strike 2. Об отладке плагинов на конкретном языке см. страницу «Отладка» этого языка в разделе Языки.
Сборка с символами
Опубликованные пакеты ядра, модулей и плагинов — релизные сборки без отладочных символов. Чтобы получить читаемые стеки и точки останова, соберите отлаживаемую часть сами:
RelWithDebInfo даёт символы вместе с оптимизациями, это ближе к тому, что работает на боевом сервере. Замените библиотеку в папке envs сервера (или в папке bin хоста, если это ядро) на собранную.
На Windows ядро загружает языковой модуль, только если оба собраны в одной конфигурации. Если собираете модуль в Debug, используйте с ним отладочную сборку ядра.
Типы Plugify в отладчике
В папке debug репозитория ядра есть форматтеры для типов plg:: (строки, векторы, варианты):
debug/vs/plg_types.natvisдля Visual Studio: добавьте его в проект или в папку Visualizers Visual Studio;debug/lldb/plg_types_formatter.pyдля LLDB: загрузите командойcommand script import <путь>/plg_types_formatter.pyили добавьте эту строку в~/.lldbinit.
Отладка на Windows
Visual Studio 2022 может запустить игру под отладчиком.
- Откройте исполняемый файл. Выберите File > Open > Project/Solution и укажите исполняемый файл игры, например
cs2.exeвgame/bin/win64.
- Задайте командную строку. В свойствах проекта, Debugging > Command Arguments, введите аргументы, с которыми вы запускаете сервер, например
-dedicated +map de_dust2.
- Выберите тип отладчика. Для нативного кода достаточно Auto. Чтобы отлаживать ещё и C#-плагины, выберите смешанный режим (native и .NET Core).
- Отключите перенаправление вывода. У игры своя консоль, которая не работает с перенаправленным выводом.
- Запустите отладку клавишей
F5. Если игра упадёт, Visual Studio остановится на месте падения со стеком и переменными.
Отладка на Linux
На Linux используйте GDB или LLDB, из командной строки или из IDE вроде CLion или VS Code. Запускайте бинарник сервера напрямую, чтобы отладчик видел весь процесс:
В GDB run запускает сервер, bt печатает стек после падения, а break <функция> ставит точку останова. Точка останова в ещё не загруженном модуле или плагине ставится как отложенная и срабатывает, когда библиотека загрузится.
Падение можно разобрать и без подключённого отладчика: если система сохраняет дампы памяти, coredumpctl gdb открывает последний.
С чего начать
- Отчёт о загрузке. После загрузки ядро пишет в лог, какие расширения не запустились и почему. Многие проблемы на этом и заканчиваются: неверный манифест, отсутствующая зависимость, библиотека, которую не удаётся загрузить.
- Уровень логирования. Запустите хост с более подробным уровнем, чтобы видеть, что ядро делает шаг за шагом; S2-Launcher принимает
--verbosity=<уровень>, см. Конфигурацию. - Минимальный пример. Воспроизведите проблему в
plugтолько с нужными расширениями: он запускается за секунду, и его легко запустить под отладчиком.
Частые случаи
- Падение внутри плагина: нулевые указатели, уничтоженный объект, неверная сигнатура в манифесте. Проверьте, что
paramTypes,retTypeиrefв манифесте совпадают с настоящей функцией. - Неверные значения между языками: манифест экспортирующего плагина и биндинги вызывающего расходятся. Перегенерируйте биндинги после изменения манифеста.
- Производительность: используйте профилировщик, например
perfили профилировщик Visual Studio, на сборкеRelWithDebInfo.
Если застряли, спросите в Discord или откройте issue на GitHub.