Перенос SA:MP/CRMP сервера с Windows на Linux и глубокая отладка крашей

Техническое руководство по миграции мультиплеерных серверов SA:MP/CRMP с платформы Windows на Linux. Особенности замены плагинов, исправление регистра путей и локализация багов с помощью Crashdetect.

20.05.2026 Русский

Часть 1: Миграция сервера на Linux (Пошаговый алгоритм)

Большинство разработчиков создают и тестируют свои игровые моды на локальных компьютерах под управлением ОС Windows. Однако запуск сервера в режиме продакшена (для реальных игроков) требует стабильности, безопасности и высокой производительности, которые может обеспечить только операционная система семейства Linux (Ubuntu, Debian, CentOS), установленная на мощностях игрового хостинга.

Процесс миграции сервера с Windows на Linux, а также последующий поиск причин падения игрового движка часто вызывают трудности у начинающих администраторов. В данном руководстве мы разберем, как правильно перенести сервер без потери данных и как локализовать любые краши кода.

Главные архитектурные различия

Главное архитектурное различие между Windows и Linux, которое ломает работу сервера SA:MP/CRMP — это чувствительность к регистру символов (Case Sensitivity) в названиях файлов и путях, а также использование разных форматов динамических библиотек (плагинов).

Шаг 1: Замена плагинов (.dll на .so)

Операционная система Linux не умеет работать с翻лами динамических библиотек формата .dll. Для нее требуются файлы общего объекта с расширением .so.

  1. Скачайте Linux-версии всех плагинов, которые использует ваш мод (например: Crashdetect, MySQL, Streamer, DC_CMD, Pawn.RakNet). Их можно найти на официальных страницах разработчиков на GitHub.
  2. Загрузите файлы с расширением .so в папку plugins/ на вашем хостинге через SFTP.
  3. Откройте конфигурационный файл server.cfg в текстовом редакторе панели управления и найдите строку plugins. Замените названия файлов.

Пример для Windows: plugins sscanf.dll mysql.dll streamer.dll
Правильный вариант для Linux: plugins sscanf.so mysql.so streamer.so (в некоторых современных версиях SA:MP допускается указывать плагины вообще без расширения, система подставит нужное автоматически).

Шаг 2: Исправление регистра букв (Case Sensitivity)

Если в Windows файлы Scriptfiles/Users/Player.ini и scriptfiles/users/player.ini — это один и тот же файл, то для Linux это два абсолютно разных пути. Если ваш скрипт обращается к папке с маленькой буквы, а на диске она создана с большой, сервер выдаст ошибку или не сможет сохранить данные игрока.

  • Приведите названия всех ключевых папок (gamemodes, filterscripts, scriptfiles, plugins) к нижнему регистру.
  • Проверьте внутренний код мода (Pawn): пути в функциях fopen(), fexist(), db_open() должны строго соответствовать реальному написанию папок на сервере хостинга.

Часть 2: Отладка крашей сервера с помощью Crashdetect

Если сервер SA:MP запускается, но внезапно закрывается («падает») во время игрового процесса, стандартный лог server_log.txt редко бывает информативным — обычно он просто обрывается. Чтобы понять, какая именно строчка в Pawn-скрипте вызвала критическую ошибку, необходимо использовать плагин Crashdetect.

Шаг 1: Компиляция мода с отладочными символами

По умолчанию компилятор Pawn (pawncc.exe) сжимает код и удаляет из готового файла .amx информацию о строках кода. Чтобы Crashdetect мог указать точное место ошибки, мод нужно перекомпилировать со специальным флагом.

  1. Открыть ваш редактор кода (Pawno, Visual Studio Code или Sublime Text).
  2. В параметрах компилятора добавьте флаг -d3.
  3. Перекомпилируйте ваш игровой мод. Размер результирующего файла .amx увеличится — это нормально, так как внутрь запишутся отладочные символы. Загрузите новый .amx на хостинг.

Важно: Использование флага -d3 не снижает производительность сервера в реальных условиях, но позволяет получить детальный стек вызовов при падении.

Шаг 2: Анализ логов Crashdetect

После установки плагина и компиляции с флагом -d3, в случае краша сервера, в лог-файл запишется детальный отчет (Backtrace). Рассмотрим пример типичной ошибки:

[14:22:10] [crashdetect] Crash detected while executing mygamemode.amx
[14:22:10] [crashdetect] AMX backtrace:
[14:22:10] [crashdetect] #0 native PlayerPlaySound () from samp-server
[14:22:10] [crashdetect] #1 in public OnPlayerDisconnect (playerid=5, reason=1) at gamemodes/mygamemode.pwn:1432
[14:22:10] [crashdetect] Run time error 4: "Array index out of bounds" (Array size 50, index 55)

Как прочитать этот лог:

Элемент лога Что это означает
Run time error 4... Тип ошибки. В данном случае: Выход за пределы массива. Скрипт попытался записать или прочитать ячейку под номером 55 в массиве, размер которого всего 50 ячеек.
at mygamemode.pwn:1432 Указывает на точную строку (1432) в вашем исходном коде, где произошел сбой.
in public OnPlayerDisconnect Автовызываемая функция (колбэк), внутри которой выполнялся код в момент падения сервера.

Частые причины крашей на хостинге

  1. Бесконечные циклы (Server freezing): Если вы некорректно настроили цикл while или for, который не имеет условий выхода, поток сервера зациклится. Хостинг зафиксирует 100% нагрузку на процессор, сервер перестанет отвечать на сетевые запросы ("зависнет") и будет принудительно перезапущен сторожевым таймером панели хостинга.
  2. Утечки памяти в MySQL: Использование функции cache_get_row_count() или создание тяжелых неоптимизированных SQL-запросов в цикле без последующей очистки памяти (cache_delete в старых версиях плагина) постепенно забивает выделенную RAM. Когда лимит оперативной памяти контейнера на хостинге исчерпывается, процесс сервера моментально уничтожается операционной системой (ошибка Out Of Memory / OOM Killer).

Совет: Всегда держите плагин Crashdetect включенным даже на готовом игровом сервере. Он промежуточно потребляет ничтожно мало ресурсов, но экономит часы работы при поиске багов после выпуска очередного обновления игрового мода.

Похожие статьи

Защита сервера SA:MP от Flood-атак и ложных пакетов на уровне Pawn

Техническое руководство по настройке защиты серверов SA:MP от сетевого флуда, взлома диалогов и нелегального спавна объектов с помощью Pawn.RakNet и Nex-AC.

Читать далее

Исправление бага с «невидимками» и рассинхронизацией виртуальных миров

Техническое руководство по устранению бага с невидимыми игроками и рассинхронизации виртуальных миров в SA:MP/CRMP с помощью правильного использования инструментов Incognito Streamer.

Читать далее

Борьба с утечками памяти (Memory Leaks) в AMX-скриптах

Техническое руководство по поиску и устранению утечек памяти в серверных скриптах SA:MP/CRMP AMX, фокусирующееся на очистке кэша MySQL, объектах Стримера и стеке.

Читать далее