Перенесення 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, об'єктах Стрімера та стеку.

Читати далі