- узнавать текущие значения переменных;
- и выяснять, по какому пути выполнялась программа.
В AMX Mod X уже встроен отладчик, которого нам вполне хватит для решения наших проблем. Значение команды amx_debug должно быть 1. Режим отладки для определенного плагина включается следующим способом: в файле ../addons/amxmodx/configs/plugins.ini напротив необходимого плагина прописываем слово debug, например:
admin.amxx debug
После этого меняем карту на сервере или перезапускаем сервер (команда restart). Теперь в логах AMXX (../addons/amxmodx/logs) мы сможем подробно узнать на каком этапе возникает ошибка в работе плагина. Логи с ошибками в директории logs называются error_X.txt, где X - это дата, когда был создан данный файл.
Допустим у нас есть плагин следующего содержания, который при входе игрока на сервер записывает его имя в глобальную переменную g_Names. Также у нас зарегистрирована консольная команда amx_names_reset для обнуления этой переменной через цикл с фиксированным количеством шагов. Данный код скомпилировался без ошибок, но это еще не значит, что он будет работать, как ему полагается. После запуска данного плагина, а также использования консольной команды amx_names_reset в директории logs мы обнаружили лог с ошибками.
debug.sma:
- Код: Выделить всё
#include <amxmodx>
#define PLUGIN "Example Debug Plugin"
#define VERSION "1.0"
#define AUTHOR "DJ_WEST"
new g_Names[33][32]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("amx_names_reset", "Names_Reset")
}
public client_putinserver(id)
{
new s_Name[32]
get_user_name(id, s_Name, charsmax(s_Name))
g_Names[id] = s_Name
server_print("%s entered the game", s_Name)
}
public Names_Reset(id)
{
for (new i = 1; i <= 33; i++)
g_Names[i] = ""
server_print("Names reset")
}
Пример текста отладки из лога error_20090901.log:
L 09/01/2009 - 08:46:52: [AMXX] Displaying debug trace (plugin "debug.amxx")
L 09/01/2009 - 08:46:52: [AMXX] Run time error 4: index out of bounds
L 09/01/2009 - 08:46:52: [AMXX] [0] debug.sma::Names_Reset (line 29)
Если разобрать данный текст, то мы видим, что сначала идет дата и время возникновения ошибки, соотвественно и ее записи в лог-файл. По данной строчке Displaying debug trace (plugin "debug.amxx") мы можем понять, что идет отладка плагина debug.amxx, в котором собственно и произошла ошибка. В следующей строчке мы видим описание ошибки Run time error 4: index out of bounds, если перевести ее на русский язык, то она означает, что "какой-то индекс вышел за пределы чего-то". Вот как раз следующая строчка нам помогает найти проблему, а именно она говорит нам, что в debug.sma в строке 29 функции Names_Reset произошла данная ошибка. Ищем в нашем debug.sma 29 строчку, это:
- Код: Выделить всё
g_Names[i] = ""
Следовательно индекс в данном случае, о котором шла речь в описании ошибки - это i, а пределы за которые он вышел - это размерность массива g_Names. Теперь смотрим объявление нашей переменной:
- Код: Выделить всё
new g_Names[33][32]
Видим, что у нас двумерный массив размерностью 33 x 32. 33 (33 - 1 = 32) - это максимальное количество игроков на сервере. Именно 33, потому что индексация массива начинается с 0, но id игроков начинается с 1 до 32, следовательно массив должен быть на 1 размер выше. А 32 - максимальная длина, в нашем случае для имени игрока.
Теперь смотрим наш цикл:
- Код: Выделить всё
for (new i = 1; i <= 33; i++)
g_Names[i] = ""
Видим, что цикл выполняется от i = 1 до i <= 33 при этом i используется в g_Names. Но если вспомнить размерность массива g_Names, то понимаем, что когда i дойдет до 33, то это будет за пределами g_Names, следовательно нам нужно исправить код на:
- Код: Выделить всё
for (new i = 1; i <= 32; i++)
g_Names[i] = ""
Заново компилируем плагин, проверяем его снова и видим, что все работает замечательно. Помните, что это лишь пример отладки. На самом деле ошибки могут быть другими, а если плагин еще и большой, то поиск ошибки может продлится гораздо дольше.