ПредишенСледващото

Отстраняване на грешки - фаза щепсел дизайн, който открива, изолати, както и елиминира грешки. За да видите къде е възникнала грешката, е необходимо:
  • разберете текущите стойности на променливите;
  • и да разберете каква програма се изпълнява на пътя.

В AMX Mod X вече е интегриран дебъгер, което би било достатъчно, за да реши проблемите ни. Amx_debug команда стойност трябва да е 1. режим Debug за конкретна приставка е включена по следния начин: във файла. /addons/amxmodx/configs/plugins.ini срещу изисква щепсела предписва дума за отстраняване на грешки. например:


След това се промени картата на сървъра или рестартиране на сървър (рестартиране командата). Сега записва AMXX (. / Addons / amxmodx / трупи) ще сме в състояние да се научат в подробности на какъв етап е налице грешка в плъгина. Дневници грешки в директорията на трупи, наречена error_X.txt. където X - е датата, на която е създаден файла.
Да приемем, че имаме плъгин за четене, което е на входа на играча към сървъра пише името му в глобалните променливи g_Names. Също така сме регистрирали amx_names_reset конзола команда за изчистване на тази променлива през примката с фиксиран брой стъпки. Този код се компилира без грешки, но това не означава, че тя ще работи както трябва. След стартирането на плъгин, както и използването на конзолни amx_names_reset командва в директорията на трупи, ние открихме, лога с грешки.

debug.sma:
Код: Избери всички #include

# определят приставката "Пример Debug приставката"
# определят версия "1.0"
#define АВТОР "DJ_WEST"

нови g_Names # 91; 33 # 93; # 91; 32 # 93;

обществен plugin_init ()
register_plugin (приставката. VERSION. автор)
register_concmd ( "amx_names_reset". "Names_Reset")
>

обществен client_putinserver (ID)
новият s_Name # 91; 32 # 93;

get_user_name (Id. s_Name. charsmax (s_Name))

g_Names # 91; идентификатор # 93; = s_Name

server_print ( "% и влезе в игра". s_Name)
>

обществен Names_Reset (ID)
за (нов I = 1; и <= 33 ; i ++)
g_Names # 91; аз # 93; = ""

server_print ( "Имена нулират")
>

Сега гледаме нашата верига:
Код: Избери всички
за (нов I = 1; и <= 33 ; i ++)
g_Names # 91; аз # 93; = ""

Виждаме, че изпълнява цикъл от I = 1 до аз <= 33 при этом i используется в g_Names. Но если вспомнить размерность массива g_Names, то понимаем, что когда i дойдет до 33, то это будет за пределами g_Names, следовательно нам нужно исправить код на:
Код: Избери всички
за (нов I = 1; и <= 32 ; i ++)
g_Names # 91; аз # 93; = ""

Re-компилира плъгин, го проверите отново и виждам, че всичко работи добре. Не забравяйте, че това е само един пример за отстраняване на грешки. Всъщност, може да има и други грешки, и ако щепселът е голям, търсене на грешки може да продължи много по-дълго.

Не ми напише PM. Ако имате нужда от помощ, без заплащане. Всякакви въпроси в този форум.

Опции:
подравняване в байтове на сегмента на данните и стека
-код изход асемблер
-C # 91 + / - # 93; компактен кодиране за изходния файл (по подразбиране = -)
име кодова или номер; например 1252 за Windows Latin-1
-Dpath активен пътека
-d0 не символична информация, никакви проверки хода на времето
-d1 # 91; # 93 подразбиране; по време на изпълнение проверки, не символична информация
-d2 пълна информация за отстраняване на грешки и динамична проверка
-d3 пълна информация за отстраняване на грешки, динамична проверка, без оптимизация
зададете име на файла грешка (тихо компилация)
дръжка на прозореца, за да изпратите съобщение за уведомяване на финала
-аз път за включване на файлове
-л създадете списък файл (предварителна обработка само)
комплект база име на изходния файл
име на набора "префикс" файл
-R # 91; име # 93; напиши препратка доклад за конзолата или до определен файл

Както можете да видите по подразбиране е д1. Тъй като не клавиши, за да събират определяне отстраняване на грешки Стар. Ако опцията да регистрирате -D3. информация за отстраняване на грешки, можете да получите малко повече.

Ако точка -d0 на. отстраняване на грешки на информация няма да бъде. Това ще усложни както демонтаж и да направи невъзможно за отстраняване на грешки. Защото, ако го включите в настройките или да добавите отстраняване на грешки при стартиране, приставката няма да работи изобщо в режим на отстраняване на грешки.

Съответно, различни размери, и приставки с тези възможности. Колкото по отстраняване на грешки на информация, за "по-тежък" плъгин.

За да зададете въпрос правилно, което трябва да знаете повече от половината от отговора.
Cerberus - подмяна AMXBans и още много други

Повярвай, но провери
Както е написано тук, стандартната Ключът е d1, но по някаква причина дизасемблер да видите символично информация. Начертайте малък експеримент - съставяне на стандарта плъгин "compile.exe" и негова собствена с различни ключове, а след разопаковането на файлове от получената AMXX 32 битов част (може да бъде 64, но няма смисъл).

Файлове като прикачен файл, за да разгледате HeksEditor - който иска да види как всъщност изглежда като всичко

Човек може да види, че "kz_scout2 Compiler.amx" и "kz_scout2 D2.amx" същото като "compile.exe" се използва само -o опция извод, че всъщност неизпълнение-D2 ключ е, а не как да пишат д1

Въпреки че е възможно да се направи допълнителен критерий: d2 добавя символична информация - която включва списък на файловете, използвани в компилацията (в "kz_scout2 Compiler.amx" види пълния път до изходния код по време на компилация: D) "низа" с позициите си, "A" - имена на функции , променливи и техния обхват на правата върху интелектуалната собственост, етикети, както и не е съвсем ясно за мен, докато полета боклук тип "Автомат" и "държава". Всичко това се записва в края на файла, така че е доста забележима при сравняване на файлове
Съгласно този диск изображения е otkompilit:
1 файл, 8 реда, четири променливи (MYSTATIC, ИД, givescout, plugin_init), 15 тагове (Float, булев, всяка т.н.), 1 "Автомат", 0 "държава".

Изглежда, че някой редактира съставител и lazhanulsya (Можете дори да ги отпишете за този "бъг")

PS Между другото описанията на опции на компилатора да има Трябва да си регистриран, за да видите връзките. и там също може да се отбележи, че ключът по подразбиране е всъщност друг.

#include
#include

/ ** пропуснете самозарядни, тъй като тя е по желание * /
#define AMXMODX_NOAUTOLOAD
#include

нов g_menuPosition # 91, # 33, 93;
нови g_menuPlayers # 91, # 33, 93, # 91; # 32 93;
нов g_menuPlayersNum # 91, # 33, 93;
нов g_menuOption # 91, # 33, 93;

нов g_menuSelect # 91, # 33, 93, # 91; # 93 254;
нов g_menuSelectNum # 91, # 33, 93;

# определят MAX_CLCMDS 24

нов g_clcmdName # 91; MAX_CLCMDS # 93; # 91; # 32 93;
Новият g_clcmdCmd # 91; MAX_CLCMDS # 93; # 91; # 93 254;
нов g_clcmdMisc # 91; MAX_CLCMDS # 93; # 91; # 93 2;
новият g_clcmdNum

обществени plugin_natives ()
set_module_filter ( "module_filter")
set_native_filter ( "native_filter")
>

обществен plugin_init ()
register_plugin ( "Играчите Меню", AMXX_VERSION_STR ", AMXX Dev Team")
register_dictionary ( "common.txt")
register_dictionary ( "admincmd.txt")
register_dictionary ( "plmenu.txt")


register_clcmd ( "amx_laccmdmenu", "cmdlaccmdmenu", ADMIN_KICK, "- дисплеи клиент меню КМД")


register_menucmd (register_menuid ( "Клиент КМД-Меню"), 1023, "actionlaccmdmenu")

Новият clcmds_ini_file # 91; 254 # 93;
get_configsdir (clcmds_ini_file, 253)
формат (clcmds_ini_file, 253, "% S / clcmdslac.ini", clcmds_ini_file)
load_settings (clcmds_ini_file)

/ * Клиент меню КМД * /

обществен actionlaccmdmenu (идентификационен номер на ключ)
превключвател (ключ)
При 7:
++g_menuOption # 91; ID # 93;
g_menuOption # 91; ID # 93; % = G_menuSelectNum # 91; ID # 93;
displaylaccmdmenu (Id, g_menuPosition # 91; ID # 93)
>
При 8: displaylaccmdmenu (Id, ++ g_menuPosition # 91; ID # 93)
При 9: displaylaccmdmenu (Id, --g_menuPosition # 91; ID # 93)
по подразбиране:
нов играч = g_menuPlayers # 91; ID # 93; # 91; g_menuPosition # 91; ID # 93; * 7 + ключ # 93;
нови знамена = g_clcmdMisc # 91; g_menuSelect # 91; ID # 93; # 91; g_menuOption # 91; ID # 93; # 93; # 93; # 91; # 93 1;

ако (is_user_connected (плейър))
Нова заповед # 91, # 93 512;, AUTHID # 91; 32 # 93;, име # 91; 32 # 93;, потребителско име # 91; 32 # 93;

замени (командване, charsmax (команда), "% потребителско име%", потребителско име)
замени (командване, charsmax (команда), "% AUTHID%", AUTHID)
замени (командване, charsmax (команда), "% название%", име)

ако (знамена 1)
server_cmd ( "% S", команда)
server_exec ()
> иначе, ако (знамена 2)
client_cmd (идентификационен номер на "% S", команда)
иначе, ако (знамена 4)
client_cmd (играч, "% S", команда)
>

ако (знамена 8)
displaylaccmdmenu (Id, g_menuPosition # 91; ID # 93)
>
>

displaylaccmdmenu (Id, поз)
ако (поз <0)
връщане

Новият menuBody # 91; 512 # 93;
нов б = 0
новият аз
ново име # 91; 32 # 93;
ново начало = поз * 7

ако (начало> = g_menuPlayersNum # 91; ID # 93)
започне = поз = g_menuPosition # 91; ID # 93; = 0

нов дъл = формат (menuBody, 511, g_coloredMenus. "\ у% L \ R ./.^ п \ т ^ п". "% L ./.^n^n" ID "CL_CMD_MENU", поз + 1 (g_menuPlayersNum # 91; ID # 93/7 + ((g_menuPlayersNum # 91; ID # 93. 7%) 1. 0)))
Новият краен = започне + 7
нови ключове = MENU_KEY_0 | MENU_KEY_8

ако (край> g_menuPlayersNum # 91; ID # 93)
край = g_menuPlayersNum # 91; ID # 93;

за (нов а = започнете; а I = g_menuPlayers # 91; ID # 93; # 91; на # 93;
get_user_name (аз, име, 31)

ако (g_menuSelectNum # 91 ;! ID # 93; || (достъп (I, ADMIN_IMMUNITY) аз! = Id))
++б

ако (g_coloredMenus)
дъл + = формат (menuBody # 91; дъл # 511;, 93-лен, "\ г ..% S ^ п \ w", б, наименование)
още
дъл + = формат (menuBody # 91; дъл # 511;, 93-лен ". #% S ^ п", име)
> Иначе ключове | = (1<

ако (is_user_admin (I))
дъл + = формат (menuBody # 91; дъл # 511;, 93-лен, g_coloredMenus "..% S \ г * ^ п \ w" "..% S * ^ п" ++ б, име ..)
още
дъл + = формат (menuBody # 91; дъл # 511;, 93-лен "..% S ^ п" ++ б, наименование)
>
>

ако (g_menuSelectNum # 91; ID # 93)
дъл + = формат (menuBody # 91; дъл # 511;, 93-лен ". ^ n8% S ^ п", g_clcmdName # 91; g_menuSelect # 91; ID # 93; # 91; g_menuOption # 91; ID # 93 ; # 93; # 93)
още
дъл + = формат (menuBody # 91; дъл # 511;, 93-лен ". ^ n8% L ^ п", ID, "NO_CMDS")

ако (край = g_menuPlayersNum # 91 ;! ID # 93)
формат (menuBody # 91; дъл # 511;, 93-лен ". ^ n9% L ^ n0% L .." ID "MORE", ID, поз "обратно" "изход" ..)
ключове | = MENU_KEY_9
>
още
формат (menuBody # 91; дъл # 511;, 93-лен ". ^ n0% L", ID, поз "обратно" "изход" ..)

show_menu (ID, ключове, menuBody, -1, "Клиент КМД-Меню")
>

обществен cmdlaccmdmenu (идентификационен номер на ниво, CID)
ако (! cmd_access (идентификационен номер на ниво, идентификационен номер 1))
върнете PLUGIN_HANDLED

за (нов а = 0, А ако (достъп (Id, g_clcmdMisc # 91; на # 93; # 91; 0 # 93))
g_menuSelect # 91; ID # 93; # 91; g_menuSelectNum # 91; ID # 93; # 93 ++; = а

displaylaccmdmenu (Id, g_menuPosition # 91; ID # 93 = 0)

load_settings (szFilename # 91; # 93)
ако (! file_exists (szFilename))
се върне 0

нов текст # 91; # 93 256;, szFlags # 91; 32 # 93;, szAccess # 91; 32 # 93;
нов а, поз = 0

докато (g_clcmdNum ако (текст # 91; 0 # 93; == ";") продължават

ако (синтактична (текст, g_clcmdName # 91; g_clcmdNum # 93; 31, g_clcmdCmd # 91; g_clcmdNum # 253;, 93, szFlags, 31, szAccess, 31)> 3)
докато (замени (g_clcmdCmd # 91; g_clcmdNum # 93;, 253, "\" "") "^")
// не правят нищо
>

g_clcmdMisc # 91; g_clcmdNum # 93; # 91; # 93 1; = Read_flags (szFlags)
g_clcmdMisc # 91; g_clcmdNum # 93; # 91; 0 # 93; = Read_flags (szAccess)
g_clcmdNum ++
>
>

Подкрепете проекта - споделете линка, благодаря!