Dragokas
Добрая душа
- Сообщения
- 229
- Реакции
- 213
11. Отладка плагинов:
Инфа от Dragokas:
- Периодически проверяйте логи addons/sourcemod/logs/error_<date>.log; наиболее важные части, как номер строки и описательная часть ошибки, часто пропускаются пользователями, когда они запрашивают помощь.
- Наиболее прямой и быстрый способ разрешения конфликтов между плагинами либо поиска проблемного плагина - это половинное деление, путём удаления половины плагинов -> тестирования -> повторения метода снова
- Установите Расширение Accelerator (лучше всего работает под Linux), которое предоставит различную отладочную инфу, когда сервер крашится.
- Используйте ключ -debug в стартовых параметрах командной строки запуска сервера для получения более детального описания в краш логах. Примечание от @Kruzya: актуально только для Linux. Для работы требует "gdb". Можно установить, к примеру, командой
apt-get install gdb
Также убедитесь, что он присутствует в переменной окруженияPATH
.
- Используйте ключ -condebug для сохранения вывода серверной консоли в лог console.log, хранящегося в корневой папке сервера.
- Утечки памяти можно найти, используя команду sm_dump_handles handles.txt и изучая результаты. Также, хороший онлайн сумматор для анализа дампа: Handle Dump parser
Обращайте внимание на сущности со слишком большим количеством дескрипторов (handles), к примеру, > 50 (кроме форвардов), а не на общий объем потребляемой ими памяти, как почему-то делают некоторые люди при анализе, если только вы не автор данного плагина, чтобы делать заключения на этом основании. - Во втором случае лучше сравнивать память по временной линии, чтобы понять утечка это или нет:
Небольшое пояснение - сделайте дамп #1, подождите до момента перед окончанием карты, сделайте дамп #2, смените карту, сделайте дамп #3; перезагрузите сервер, сделайте дамп #4, последовательно сравните все снимки (например, через WinMerge), выделив наиболее подозрительные значения, чтобы увидеть на сколько сильно гуляет кол-во и объем памяти/хендлов в разное время. В большинстве случаев, значения не будут отличаться, либо будут, но в очень небольших пределах.
- Используйте плагин Valve Profiler для измерения производительности каждого плагина в разрезе отдельных функций, используя профайлер Valve. В отчёте также будет стек вызова функций плагинов и игры, а также графики с сортировками по макс. кол-ву вызовов, макс. времени, затраченном на вызов и т.п.
- Функция LogStackTrace - полезна для записи цепочки стека вызова функций в лог ошибок. Эта функция доступна, начиная с SM 1.10.
- Пример кода оценки производительности плагина (бенчмаркинг):
- Ещё я запускаю sm_test несколько раз для получения более усреднённого результата. Иногда минимальное и максимальное значения весьма отличаются.
PHP:
#include <profiler>
public void OnPluginStart()
{
RegAdminCmd("sm_test", sm_test, ADMFLAG_ROOT);
}
public Action sm_test(int client, int args)
{
Handle hProf = CreateProfiler();
float min = 10.0, max, avg;
const int TIMES = 20; // Запуск теста 20 раз для получения min/max/avg
const int ITER = 1000; // Запуск 1000 итераций для нашего теста
for( int x = 0; x < TIMES; x++ )
{
StartProfiling(hProf);
for( int i = 0; i < ITER; i++ )
{
// Вставьте сюда код функции, которую желаете протестироваать
}
StopProfiling(hProf);
float speed = GetProfilerTime(hProf);
if( speed < min ) min = speed;
if( speed > max ) max = speed;
avg += speed;
}
// Отображает минимальное, максимальное и среднее значения.
avg /= TIMES;
PrintToServer("Bench: Min %f. Avg %f. Max %f", min, avg, max);
delete hProf;
}
Последнее редактирование: