Hibakeresés plugins AMX Mod X - orosz közösség scripting AMXX

Hibakeresés - fáziskúpos design, amely megállapítja, elkülöníti, és kiküszöböli a hibákat. Hogy hol a hiba történt, szükség van:
  • megtudja változók aktuális értékei;
  • és megtudja, milyen program fut az úton.







Az AMX Mod X már beépített debugger, ami elég ahhoz, hogy megoldja a problémákat. Amx_debug parancs érték legyen 1 Debug mód egy adott bővítmény szerepel a következő módon: a fájlban. /addons/amxmodx/configs/plugins.ini szemben a szükséges plug ír szó debug. például:


Ezt követően módosíthatja a térkép a kiszolgálón, vagy indítsa újra a kiszolgálót (újraindítás) parancsot. Most rönk AMXX (. / Kiegészítések / amxmodx / logs) képesek leszünk tanulni részletesen, milyen stádiumban van egy hiba a plugin. Naplók hibákat a logs könyvtárban nevű error_X.txt. ahol X - az az időpont, amikor a fájl létrehozásának.
Tegyük fel, hogy van egy plugin, hogy olvasni, ami a bejáratnál, hogy a játékos a szerveren írja a nevét a globális változó g_Names. Szintén már regisztrált amx_names_reset konzol parancsot állítani ezt a változót a hurok egy meghatározott számú lépést. Ez a kód összeállítani hiba nélkül, de ez nem jelenti azt, hogy ez működni fog, ahogy kellene. Elindítása után a bővítményt, valamint a használatát konzolos amx_names_reset parancs a logs könyvtárban, megtaláltuk a naplót hibákkal.

debug.sma:
Kód: Egész kiválasztása #include

#define beépülő modul „példa Debug beépülő modul”
#define VERSION "1.0"
#define AUTHOR "DJ_WEST"

új g_Names # 91; 33 # 93; # 91; 32 # 93;

nyilvános plugin_init ()
register_plugin (bővítményt. VERSION. szerző)
register_concmd ( "amx_names_reset". "Names_Reset")
>

nyilvános client_putinserver (id)
új s_Name # 91; 32 # 93;

get_user_name (id. s_Name. charsmax (s_Name))

g_Names # 91; id # 93; = s_Name

server_print ( "% s belépett a játék". s_Name)
>

nyilvános Names_Reset (id)
az (új i = 1; i <= 33 ; i ++)
g_Names # 91; én # 93; = ""

server_print ( "Nevek reset")
>

Most nézzük meg hurok:
Kód: Egész kiválasztása
az (új i = 1; i <= 33 ; i ++)
g_Names # 91; én # 93; = ""

Látjuk, hogy hurok fut i = 1 i <= 33 при этом i используется в g_Names. Но если вспомнить размерность массива g_Names, то понимаем, что когда i дойдет до 33, то это будет за пределами g_Names, следовательно нам нужно исправить код на:
Kód: Egész kiválasztása
az (új i = 1; i <= 32 ; i ++)
g_Names # 91; én # 93; = ""

Újra összeállítja a plug-in, nézd meg újra és látni, hogy minden rendesen működik. Ne feledje, hogy ez csak egy példa a hibakeresés. Sőt, lehet, hogy más hiba, s ha a dugó is nagy, a hiba keresés tarthat sokáig.

Ne írjon nekem egy PM. Ha segítségre van szüksége, ingyenesen. Bármilyen kérdése van a fórum.

lehetőségek:
-A összehangolás byte az adatok szegmens és a máglya
-a kimeneti assembler kód
-C # 91; + / - # 93; kompakt kódoló kimeneti fájlban (alapértelmezett = -)
-c codepage név vagy szám; például 1252 for Windows Latin-1
-Dpath aktív könyvtár elérési útját
-d0 nem szimbolikus információ, nincs futásidejű ellenőrzés
-d1 # 91; # 93 alapértelmezett; futásidejű ellenőrzés, nincs szimbolikus információ
-d2 teljes nyomkövetési információ és dinamikus ellenőrzését
-d3 teljes debug információ, dinamikus ellenőrzés, nincs optimalizálás
-e állítsa neve hibafájlba (csendes fordításkor)
-H kilincs egy értesítést küld üzenetet kivitelben
-én útvonalát tartalmazzák kép
-l létrehozni lista fájlt (preprocess csak)
-o set alap neve kimeneti fájl
-p állítsa neve „előtag” fájl
-R # 91; neve # 93; írására hivatkozás az a konzol vagy a megadott fájlt

Mint látható ez gyárilag -d1. Mivel nincs kulcs összeállításához meghatározó hibakeresés Old. Ha a lehetőség, hogy regisztráljon -D3. információkat a hibakeresés, akkor kap egy kicsit.

Ha a pont -d0. hibakereső információt nem lesz. Ez egyaránt bonyolultabbá szétszerelés és lehetetlenné teszik a hibakeresés. Mert ha bekapcsolja a beállítások, vagy add hibakeresés induláskor, a beépülő modul nem fut minden debug módban.

Ennek megfelelően a különböző méretű, és plug-inek ezeket a lehetőségeket. Minél több hibakeresés az információ, a „nehezebb” plugin.

Feltenni egy kérdést helyesen, meg kell tudni, hogy több, mint a fele a választ.
Cerberus - csere amxbans és még sok más

Bízz, de ellenőrizze,
Ahogy írva van, a standard kulcs d1, de valamilyen oknál fogva bontói tekintheti szimbolikus információ. Rajzolj egy kis kísérletet - összeállítja a plugin standard „compile.exe” és a saját különböző kulcsokat, majd csomagolja ki a fájlokat a kapott AMXX 32 bites része (lehet 64, de nincs értelme).







Files mellékleteként átnéz HeksEditor -, aki azt akarja, hogy hogyan is néznek ki mindent

Láthatjuk, hogy a „kz_scout2 Compiler.amx” és „kz_scout2 D2.amx” ugyanaz, mint „compile.exe” csak akkor használja a -o opció arra következtetnek, hogy a ténylegesen teljesített D2 kulcs, ahelyett, hogyan kell írni -d1

Bár lehetséges, hogy egy további kritérium: d2 hozzáteszi szimbolikus információ - amely magában foglalja a fájlok listáját használt összeállítása (a „kz_scout2 Compiler.amx” látta a teljes elérési utat a forráskódot fordításkor: D) „string” a helyüket, az „A” - funkció nevek változók és azok körét IPR, címkéket és nem teljesen világos számomra, amíg szemetet típusú mezők „Automat” és az „állam”. Mindezt rögzítik a fájl végére, így elég észrevehető, ha összehasonlítjuk a fájlokat
E szerint a lemez képalkotó volt otkompilit:
1 fájl, 8 pályás, négy változó (MYSTATIC, id, givescout, plugin_init), 15 tag (Float, bool, bármilyen stb), 1 "Automat", 0 "állam".

Úgy néz ki, mintha valaki szerkesztette a fordító és lazhanulsya (Akkor is iratkozni őket erről a „bug”)

PS Mellesleg leírásai fordító beállításai rendelkeznie kell regisztrálni, hogy a linkeket. és ott is meg lehet jegyezni, hogy az alapértelmezett kulcs valójában egy másik.

#include
#include

/ ** hagyja öntöltő, mivel ez nem kötelező * /
#define AMXMODX_NOAUTOLOAD
#include

új g_menuPosition # 91, # 33, 93;
új g_menuPlayers # 91, 33 # 93; # 91; # 32 93;
új g_menuPlayersNum # 91, # 33, 93;
új g_menuOption # 91, # 33, 93;

új g_menuSelect # 91, 33 # 93; # 91; # 93 254;
új g_menuSelectNum # 91, # 33, 93;

#define MAX_CLCMDS 24

új g_clcmdName # 91; MAX_CLCMDS # 93; # 91; # 32 93;
új g_clcmdCmd # 91; MAX_CLCMDS # 93; # 91; # 93 254;
új g_clcmdMisc # 91; MAX_CLCMDS # 93; # 91; # 93 2;
új g_clcmdNum

nyilvános plugin_natives ()
set_module_filter ( "module_filter")
set_native_filter ( "native_filter")
>

nyilvános plugin_init ()
register_plugin ( "A játékosok menü", 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 "- kijelzők ügyfél Parancs menü")


register_menucmd (register_menuid ( "Ügyfél CMDS menü"), 1023, "actionlaccmdmenu")

új clcmds_ini_file # 91; 254 # 93;
get_configsdir (clcmds_ini_file, 253)
formátum (clcmds_ini_file, 253, "% s / clcmdslac.ini", clcmds_ini_file)
load_settings (clcmds_ini_file)

/ * Ügyfél Parancs menü * /

nyilvános actionlaccmdmenu (id, kulcs)
kapcsoló (nyomógomb)
esetében 7:
++g_menuOption # 91; ID # 93;
g_menuOption # 91; ID # 93; % = G_menuSelectNum # 91; ID # 93;
displaylaccmdmenu (id, g_menuPosition # 91; ID # 93;)
>
8. eset: displaylaccmdmenu (id, ++ g_menuPosition # 91; ID # 93;)
9. eset: displaylaccmdmenu (id, --g_menuPosition # 91; ID # 93;)
alapértelmezett:
új játékos = g_menuPlayers # 91; id # 93; # 91; g_menuPosition # 91; id # 93; * 7 + kulcs # 93;
új zászlók = g_clcmdMisc # 91; g_menuSelect # 91; ID # 93; # 91; g_menuOption # 91; ID # 93; # 93; # 93; # 91; # 93 1;

if (is_user_connected (játékos))
Új parancs # 91, # 93 512;, AUTHID # 91; 32 # 93; neve # 91; 32 # 93;, userid # 91; 32 # 93;

cserélni (parancs charsmax (parancs), "% userid%" userid)
cserélni (parancs charsmax (parancs), "% AUTHID%" AUTHID)
cserélni (parancs charsmax (parancs), "% name%", név)

if (zászlók 1)
server_cmd ( "% s", parancs)
server_exec ()
> Else if (zászlók 2)
client_cmd (id, "% s", parancs)
else if (zászlók 4)
client_cmd (játékos, "% s", parancs)
>

if (zászlók 8)
displaylaccmdmenu (id, g_menuPosition # 91; ID # 93;)
>
>

displaylaccmdmenu (id, POS)
if (pos <0)
visszatérés

új menuBody # 91; 512 # 93;
új b = 0
új i
Új név # 91; 32 # 93;
új start = pos * 7

ha (start> = g_menuPlayersNum # 91; ID # 93;)
start = pos = g_menuPosition # 91; ID # 93; = 0

új LEN = formátum (menuBody, 511, g_coloredMenus. "\ y% L \ R ./.^ n \ w ^ n". "% L ./.^n^n", id, "CL_CMD_MENU", Pos + 1 , (g_menuPlayersNum # 91; ID # 93; / 7 + ((g_menuPlayersNum # 91; ID # 93; 7%) 1. 0).))
vége új = start + 7
új kulcsok = MENU_KEY_0 | MENU_KEY_8

ha (end> g_menuPlayersNum # 91; ID # 93;)
end = g_menuPlayersNum # 91; ID # 93;

az (új a = indul el; a i = g_menuPlayers # 91; ID # 93; # 91; a # 93;
get_user_name (i név, 31)

ha (g_menuSelectNum # 91 ;! ID # 93; || (hozzáférési (i, ADMIN_IMMUNITY) i! = id))
++b

if (g_coloredMenus)
LEN + = méret (menuBody # 91; LEN # 511;, 93-len, "\ d ..% s ^ n \ w", b, név)
más
LEN + = méret (menuBody # 91; LEN # 511;, 93-len, "#% s ^ n.", név)
> Else kulcsok | = (1<

ha (is_user_admin (i))
LEN + = méret (menuBody # 91; LEN # 511;, 93-len, g_coloredMenus "..% s \ r * ^ n \ w" "..% s * ^ n", ++ b, neve ..)
más
LEN + = méret (menuBody # 91; LEN # 511;, 93-len, "..% s ^ n", ++ b, név)
>
>

ha (g_menuSelectNum # 91; ID # 93;)
LEN + = méret (menuBody # 91; LEN # 511;, 93-len, "^ N8% s ^ n", g_clcmdName # 91; g_menuSelect # 91; ID # 93; # 91; g_menuOption # 91; ID # 93 ; # 93; # 93;)
más
LEN + = méret (menuBody # 91; LEN # 511;, 93-len, "^ N8% L ^ n", id, "NO_CMDS")

ha (end = g_menuPlayersNum # 91 ;! ID # 93;)
formátum (menuBody # 91; LEN # 511;, 93-len, "^ N9% L ^ n0% L ..", id, "több", id, POS "vissza" "EXIT" ..)
kulcsok | = MENU_KEY_9
>
más
formátum (menuBody # 91; LEN # 511;, 93-len, "^ n0% L", id, POS "vissza" "EXIT" ..)

show_menu (id, kulcsok, menuBody, -1, "Ügyfél CMDS menü")
>

nyilvános cmdlaccmdmenu (id, szint, CID)
if (! cmd_access (id, szint, CID, 1))
visszaút PLUGIN_HANDLED

az (új a = 0; ha (hozzáférési (id, g_clcmdMisc # 91; a # 93; # 91; 0 # 93;))
g_menuSelect # 91; ID # 93; # 91; g_menuSelectNum # 91; ID # 93; # 93 ++; = a

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

load_settings (szFilename # 91; # 93;)
if (! file_exists (szFilename))
return 0

új szöveg # 91; # 93 256;, szFlags # 91; 32 # 93;, szAccess # 91; 32 # 93;
új egy, pos = 0

while (g_clcmdNum if (szöveg # 91; 0 # 93; == '') is

ha (parse (szöveg, g_clcmdName # 91; g_clcmdNum # 93;, 31, g_clcmdCmd # 91; g_clcmdNum # 253;, 93, szFlags, 31, szAccess, 31)> 3)
míg a (cserélje (g_clcmdCmd # 91; g_clcmdNum # 93;, 253, "\", "") "^")
// nem csinál semmit
>

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 ++
>
>