Skip to main content
Если SS14.Watchdog обнаруживает, что ваш сервер завис, он завершит его и перезапустит. Если это происходит по-настоящему на живом сервере, шанс просто посмотреть логи упущен. Это руководство даст краткое введение в то, как подойти к отладке такого рода проблем.
Чтобы было ясно: вы можете получить похожую ошибку, если игровой сервер не может связаться с watchdog из-за неправильной конфигурации, и в этом случае игровой сервер будет надёжно завершаться после запуска по кругу. Эта статья не об этом, а о настоящей, реально серьёзной ошибке-зависании.

Предыстория: Ping’и Watchdog

Watchdog ожидает, что игровой сервер будет отправлять ему регулярные ping-сообщения, указывающие на то, что игровой сервер всё ещё жив. Игровой сервер отправляет эти ping’и с регулярным интервалом в 15 секунд (в настоящее время не настраивается, о чём я думал?), и watchdog ожидает хотя бы один ping каждые TimeoutSeconds в конфигурации экземпляра. Если игра застрянет в бесконечном цикле какого-либо рода, она перестанет отправлять эти ping’и, и watchdog быстро завершит её и перезапустит.

Итак, что у нас есть?

Если вы хотите легко спровоцировать это, подключитесь к вашему серверу и выполните что-то вроде этого в scsi: scsi prompt about to run 'while (true)  ' Разворачивая выдержку из лога выше, мы получаем что-то вроде этого:
Если вы вообще читаете эту страницу, я надеюсь, у вас достаточно опыта хостинга серверов, чтобы знать об этом, но просто для ясности: эти два сообщения [WARN]не проблема.
Сам игровой сервер не создал значимых логов (как это редко бывает в подобных случаях), всё, что у нас есть — это то, что watchdog убил нас. К счастью, watchdog настроен по умолчанию создавать дамп ядра (core dump) процесса игрового сервера, если ему пришлось его убить, и указал путь к дампу в выводе лога. Что такое дамп ядра? Это файл, который содержит память процесса на момент сбоя. По умолчанию этот дамп включает достаточно памяти для получения информации о стеке вызовов с помощью отладчика. Если вам нужно больше, вы можете изменить свойство TimeoutDumpType в конфигурации экземпляра watchdog на одно из этих значений. Предупреждаем: дампы ядра довольно большие, и запись большего объёма информации может сделать их чрезвычайно большими.
Дампы ядра могут содержать конфиденциальную информацию с вашего сервера (например, пароли базы данных) и не должны передаваться людям, которым вы не доверяете!
«Итак, у меня есть файл весом в несколько сотен мегабайт, что мне с ним делать? Перетащить его в Rider?» Ох, наивный вы мой. У вас есть два варианта для отладки, о которых я знаю: lldb и WinDBG. Один из них — отладчик командной строки. Другой — отладчик командной строки для Windows, который, по крайней мере, имеет базовый интерфейс. Эй, по крайней мере, вам не нужно использовать gdb!
Дампы ядра — хрупкие создания, и по умолчанию не включают весь контекст, необходимый для самостоятельной отладки чего-либо. В общем, легче всего отлаживать их в системе, где они произошли, и при условии, что ни один из базовых файлов не изменился, например, из-за обновления игрового сервера.При наличии необходимого опыта и/или инфраструктуры (символьные серверы, мои любимые) можно обрабатывать их намного позже или на другой системе, но это далеко выходит за рамки данного руководства, и даже у меня нет опыта в этом.1

Использование lldb

lldb — это приличный2 отладчик для Linux и macOS. Установите его:
Вам также понадобится SOS. Он расширит lldb, чтобы сделать возможной отладку .NET-трассировки:
Теперь вы готовы загрузить дамп ядра в lldb:
Вам понадобится шпаргалка для этого приглашения (lldb).
На этом этапе у вас открыт нативный отладчик, и вы можете полноценно отлаживать всё. Если игровой сервер падает из-за нативных сбоев, это также способ его отладки. Вы можете использовать обычные команды lldb для обычной нативной отладки нативных модулей и всего прочего. Хотя это всё ещё не для слабонервных и может потребовать дополнительной настройки, например, для получения символов нативных библиотек. Чтобы получить некоторую значимую информацию из управляемого стека вызовов, мы можем выполнить команду clrstack из SOS:
Теперь с этим можно работать! Внизу находится main программы, вверху — Submission#0, что является внутренней деталью C# Interactive, в котором мы выполнили while (true) { }. Хотя я не могу показать вам байт-код IL или C#-код в lldb (ну, я уверен, что первое возможно с SOS), я могу показать вам ассемблерный код, который выглядит как довольно простой бесконечный цикл:
Надеюсь, это помогло начать разбираться с использованием нативного отладчика для подобных вещей.

Использование WinDBG

WinDBG — это отладчик для Windows, который достают, когда всё остальное не помогло (а здесь именно так). Вы можете получить WinDBG Preview из Microsoft Store. Вам также понадобится SOS. Он расширит WinDBG, чтобы сделать возможной отладку .NET-трассировки:
Вы можете загрузить созданный файл дампа в WinDBG, перейдя в File -> Start debugging -> Open dump file, затем выбрав файл. Если у файла нет расширения, вам нужно изменить фильтр в диалоге открытия, чтобы выбрать его. Showing the navigation in WinDBG to open dump file Вам нужно будет выполнить команду .load, упомянутую в выводе выше, чтобы загрузить SOS:
Вам, вероятно, всё равно понадобится хорошая шпаргалка для WinDBG Preview. У него есть небольшой интерфейс, но использование внутренней командной строки всё ещё очень необходимо. В любом случае, я не смог найти ничего похожего на хорошо оформленную шпаргалку lldb за 5 секунд поиска в интернете, так что ищите сами, я думаю.
Я не буду повторяться со стороны lldb: у вас есть полноценный нативный отладчик. Он может делать всё, если вы знаете, как им пользоваться. Вы можете использовать !clrstack для отображения управляемого стека вызовов:
То же самое, что и выше. Снова. Вау! Надеюсь, это помогло начать разбираться с использованием нативного отладчика для подобных вещей.
🤫 Я на самом деле использовал dotnet dump collect для получения дампа Windows, потому что мне было лень настраивать watchdog дважды ради этой статьи. Работает так же, в основном. Чёрт, я почти уверен, что он использует ту же базовую библиотеку для создания дампа, что и watchdog!

Footnotes

  1. Я пытался открыть дамп ядра Linux в WinDBG, который до некоторой степени поддерживается… но он жаловался на недостающее количество файлов и другие проблемы, так что я сдался. Попробуйте переместить папку вашего watchdog bin/ в сторону и отлаживать дамп ядра с помощью lldb… Да, результаты будут совершенно разными, не так ли?
  2. Настолько хорош, насколько может быть инструментарий разработки на Linux, то есть не очень хорошо.
Последнее изменение 21 июня 2026 г.