Problem z "stack error"
Eryk172
07.02.2016
Siemka, mam problem z pluginem, poniżej przedstawię wycinek kodu oraz błędy które się pojawiają na serwerze.
Liczę na pomoc, nie mam pomysłów jak to zrobić. Dzięki!
L 02/02/2016 - 18:54:23: Info (map "jail_anka_v1") (file "addons/amxmodx/logs/error_20160202.log") L 02/02/2016 - 18:54:23: [AMXX] Displaying debug trace (plugin "jail_api_jailbreak.amxx") L 02/02/2016 - 18:54:23: [AMXX] Run time error 3: stack error L 02/02/2016 - 18:54:23: [AMXX] [0] jail_api_jailbreak.sma::ForwardDayStartPre (line 2927) L 02/02/2016 - 18:54:23: [AMXX] [1] jail_api_jailbreak.sma::PreRoundStart (line 2712) L 02/02/2016 - 18:54:23: [AMXX] Displaying debug trace (plugin "jail_api_jailbreak.amxx") L 02/02/2016 - 18:54:23: [AMXX] Run time error 3: stack error L 02/02/2016 - 18:54:23: [AMXX] [0] jail_api_jailbreak.sma::msg_TextMsg (line 2517) L 02/02/2016 - 18:54:23: [AMXX] Displaying debug trace (plugin "jail_api_jailbreak.amxx") L 02/02/2016 - 18:54:23: [AMXX] Run time error 3: stack error L 02/02/2016 - 18:54:23: [AMXX] Displaying debug trace (plugin "jail_api_jailbreak.amxx") L 02/02/2016 - 18:54:23: [AMXX] Run time error 3: stack error L 02/02/2016 - 18:54:23: [AMXX] [0] jail_api_jailbreak.sma::msg_TextMsg (line 2517)
Za każdym razem jest ten sam zestaw błędów, występuje to od razu po zmianie mapy.. i nie zawsze. Czasami. Do kilku razy dziennie.
public msg_TextMsg() { new message[32]; // (line 2517) get_msg_arg_string(2, message, 31); if(equal(message, "#Game_teammate_attack") || equal(message, "#Killed_Teammate")) return PLUGIN_HANDLED; if(equal(message, "#Terrorists_Win")) { set_msg_arg_string(2, "Wiezniowie dojechali klawiszy!"); return PLUGIN_CONTINUE; } else if(equal(message, "#CTs_Win")) { set_msg_arg_string(2, "Straznicy dobrze wykonali swoja robote!"); return PLUGIN_CONTINUE; } else if(equal(message, "#Round_Draw")) { set_msg_arg_string(2, "Runda remisowa!") return PLUGIN_CONTINUE; } else if(equal(message, "#Only_1_Team_Change")) { set_msg_arg_string(2, "Druzyne mozesz zmienic tylko raz!") return PLUGIN_CONTINUE; } else if(equal(message, "#Switch_To_SemiAuto")) { set_msg_arg_string(2, "Zmieniono na tryb pol-automatyczny") return PLUGIN_CONTINUE; } else if(equal(message, "#Switch_To_BurstFire")) { set_msg_arg_string(2, "Zmieniono na tryb serii") return PLUGIN_CONTINUE; } else if(equal(message, "#Switch_To_FullAuto")) { set_msg_arg_string(2, "Zmieniono na tryb automatyczny") return PLUGIN_CONTINUE; } else if(equal(message, "#Game_Commencing")) { set_msg_arg_string(2, "Za chwile rozpozcznie sie gra! Milej zabawy:-)"); return PLUGIN_CONTINUE; } else if(equal(message, "#Cannot_Be_Spectator")) { set_msg_arg_string(2, "Nie mozesz byc obserwatorem!"); return PLUGIN_CONTINUE; } return PLUGIN_HANDLED; } [...] public PreRoundStart() { ClearSyncHud(0, SyncHudObj1); ClearSyncHud(0, SyncHudObj2); ClearSyncHud(0, SyncHudObj3); lr_started = false; g_DuelA = 0; g_DuelB = 0; nr_duel = 0; nozoom = false; head = false; UsuwanieWydarzen(); end_usun = true; szInfo = ""; szInfo2 = ""; szPoszukiwani = ""; szFreeday = ""; prowadzacy = 0; obsluga_dala = false; otwarte = false; pokaz_raz = false; czas_bronie = false; zabawa_wybrana = false; mode_gracza[WALKA] = false; mode_gracza[MIKRO] = false; mode_gracza[FF_TT] = false; mode_gracza[TT_GOD] = false; mode_gracza[CT_GOD] = false; mode_gracza[CT_NIE_MOZE_TT] = false; mode_gracza[TT_NIE_MOZE_CT] = false if(task_exists(ID_DZWIEK_POSZ)) remove_task(ID_DZWIEK_POSZ); if(task_exists(ID_LOS_PROWADZACY)) remove_task(ID_LOS_PROWADZACY); if(task_exists(ID_POJEDYNEK)) remove_task(ID_POJEDYNEK); if(task_exists(ID_BONUS)) remove_task(ID_BONUS); if(task_exists(ID_FREZZ)) remove_task(ID_FREZZ); if(task_exists(2761234, 1)) remove_task(2761234, 1); if(task_exists(ID_TASK_CELL)) remove_task(ID_TASK_CELL); if(task_exists(ID_DOLACZ)) remove_task(ID_DOLACZ); if(!czas_dolacz && ilosc_graczySAVE > 7 && jail_day > 1) { //ColorChat(0, 0, "^4[JailBreak]^3 Musicie wytrwac runde conajmniej 2 minuty! Nadal jest ^4 %s", dni_tygodnia[jail_day%7]); } else { jail_day++; } for(new i=0; i<=10; i++) { dane_dnia[i] = 0; } czas_dolacz = false; if(jail_day) { gTimeStart = get_systime(); ForwardDayStartPre(jail_day%7); // (line 2712) } } [...] ForwardDayStartPre(zabawa) { new iRet new is_frezz = g_FreezeTime-(get_systime()-gTimeStart); new czas = g_RoundTime+min(is_frezz, 0); // (line 2927) ExecuteForward(fDayStartPre, iRet, zabawa, PrepareArray(szInfo, 256, 1), PrepareArray(szInfo2, 512, 1), PrepareArray(dane_dnia, 10, 1), czas); id_zabawa = zabawa; new dane[1] dane[0] = zabawa; if(is_frezz) set_task(is_frezz+0.1, "ForwardDayStartPost", ID_FREZZ, dane, 1); else ForwardDayStartPost(dane); }
Sniper Elite
08.02.2016
a stackerror occures if the heapsize is full, this usually occures on to huge/many variables or any leak in your plugin.
i z amxx.pl
W tym konkretnym publicu optymalizacja nie ms zbyt wiele sensu musisz zoptymalizować cały plugin pod względem używania pamięci
Eryk172
08.02.2016
W sumie raczej błąd nie w tym, skoro jest ich za dużo nie powinno od razu wywalić serwera?
Wyłączę jakieś pluginy, to i tak błąd jest.. ;/
Użytkownik Eryk172 edytował ten post 08.02.2016 19:31
Sniper Elite
08.02.2016
W sumie raczej błąd nie w tym, skoro jest ich za dużo nie powinno od razu wywalić serwera?
Wyłączę jakieś pluginy, to i tak błąd jest.. ;/
No nie do końca, bo masz jeszcze zmienne lokalne, które są umieszczane na stosie dopiero gdy funkcja zaczyna działać.
Może dodałeś jakąś pętlę która się czasami zapętla, a w środku jest tworzona zmienna.
Fajni byłoby gdyby serwery po crashu zapisywały logi ostatnio uruchamianych funkcji
Eryk172
08.02.2016
Masz na myśli żeby dodać log_to_file w każdej funkcji ?
Okej, a więc mamy patrzeć na wszystkie pluginy czy tylko na ten w którym występuje błąd
Sniper Elite
09.02.2016
Nie wiem, musiałby się wypowiedzieć ktoś bardziej ogarnięty. Jeżeli dzieje się to często to wyłączaj pluginy po 3 i obserwuj.
Eryk172
21.02.2016
Zabawiłem się w logi przy funkcjach.
I jest taki problem że public PreRoundStart() wykonuje się w ciągu sekundy ok 200 razy.. co wywołuje forward.. serwer się przymula i crash.
Zawartość funckji:
register_event("HLTV", "PreRoundStart", "a", "1=0", "2=0"); [***] public PreRoundStart() { czas_dolacz = false; lr_started = false; g_DuelA = 0; g_DuelB = 0; nr_duel = 0; nozoom = false; head = false; end_usun = true; szInfo = ""; szInfo2 = ""; szPoszukiwani = ""; prowadzacy = 0; obsluga_dala = false; otwarte = false; pokaz_raz = false; czas_bronie = false; zabawa_wybrana = false; mode_gracza[WALKA] = false; mode_gracza[MIKRO] = false; mode_gracza[FF_TT] = false; mode_gracza[TT_GOD] = false; mode_gracza[CT_GOD] = false; mode_gracza[CT_NIE_MOZE_TT] = false; mode_gracza[TT_NIE_MOZE_CT] = false if(task_exists(ID_DZWIEK_POSZ)) remove_task(ID_DZWIEK_POSZ); if(task_exists(ID_LOS_PROWADZACY)) remove_task(ID_LOS_PROWADZACY); if(task_exists(ID_BONUS)) remove_task(ID_BONUS); if(task_exists(ID_FREZZ)) remove_task(ID_FREZZ); if(task_exists(2761234, 1)) remove_task(2761234, 1); if(task_exists(ID_TASK_CELL)) remove_task(ID_TASK_CELL); if(task_exists(ID_DOLACZ)) remove_task(ID_DOLACZ); for(new i=0; i<=10; i++) { dane_dnia[i] = 0; } jail_day++; if(jail_day) { gTimeStart = get_systime(); #if defined DEBUG log_to_file("jail_api_jailbreak.log", "ForwardDayStartPre PreRoundStart"); #endif ForwardDayStartPre(jail_day%7); } for(new i=1; i<=MAX;i++) { if(!is_user_connected(i) || is_user_hltv(i)) continue; userreason[i] = random_num(1, charsmax(reasons) ) if((gs_GetUserBanMIC(i) == 1 || gs_GetUserBanCT(i) == 1) && gTeam[i] == 2) { GdzieDojsc(i, 1) } } }
Ktoś ma na to jakieś logiczne wyjaśnienie?
Użytkownik Eryk172 edytował ten post 21.02.2016 19:58
grankee
28.02.2016
w którym miejscu dałeś log_to_file w tej funkcji?
Spróbuj ją zastąpić:
#include <amxmodx> #include <amxmisc> public plugin_init() { register_logevent("Poczatek_Rundy", 2, "1=Round_Start") } public Poczatek_Rundy() { //code }