GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: tudvari - 2012. június 26. - 22:33:20

Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 26. - 22:33:20
Sziasztok,eddig nem volt ilyen hiba a szerveremen,de most van:
Random parancsoktól crashel a szervermvan amikor mûködik,van amikor meg crashel tõle.
Pl.: /elet-tel a hp-mat 100-ra akarom rakni.Crashel.
Resi után már nem crashel,de utána a meg a frakció módosítástól.Resi után már az is mûködik.Szóval nem tudom mi a logika a crashek között.
[22:37:45] [debug] Server crashed while executing loginom.amx
[22:37:45] [debug] AMX backtrace:
[22:37:45] [debug] #0  native fwrite () [00405710] from samp-server.exe
[22:37:45] [debug] #1  000015f8 in ?? () from loginom.amx
[22:37:45] [debug] #2  00001868 in ?? () from loginom.amx
[22:37:45] [debug] #3  00046468 in public AutomatikusMentes () from loginom.amx
[22:37:45] [debug] System backtrace:
[22:37:46] [debug] #0  00491f90 in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
[22:37:46] [debug] #1  0040534e in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
Ezt írja crashdetect.Automatikus Mentes-ben nem lehet hiba,mert azt gyakran lefuttatja,és akkor kb 10 mp után crashelnie kellet volna.
Ui.: mindig ezt írja ki,még ha más parancsnál crashel,akkor is.
Cím: Crashelés parancsnál
Írta: dexi - 2012. június 26. - 23:46:00
Ezek szerint mégis a loginom.amx-tõl. Facen írj rám küld el az FS-t és meglesem.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 27. - 07:06:02
nem fs.Csak amikor elkezdtem írni a modomat,akkor elneveztem loginomnak és azóta az a neve. :D Ez a teljes gamemode.
Cím: Crashelés parancsnál
Írta: Benceee - 2012. június 27. - 15:21:52
Másold be azt az élet parancsot.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 27. - 15:59:06
CMD:elet(playerid,params[])
{
/*------*/
new id, elet;
/*------*/
if(sscanf(params,\"ui\",id,elet))return SendClientMessage(playerid,SZURKE,\"Használat: /elet [Név/Játékos ID] [Élet összeg]\");
{
if(Belepve[playerid] != 0)
{
if(JatekosInfo[playerid][Admin] > 0)
   {
   if(id != INVALID_PLAYER_ID)
      {
         SetPlayerHealth(id, elet);
         new string[256];
                 new string2[256];
         GetPlayerName(playerid,nev,sizeof(nev));
         GetPlayerName(id,fogadonev,sizeof(fogadonev));
         format(string,sizeof(string),\"%s átállította az életedet %d-ra/re!\",nev,elet);
         format(string2,sizeof(string2),\"%s átállította %s életet %d-ra/re!\",nev,fogadonev,elet);
         AdminnakUzenet(VNARANCS, string2, 1);
         SendClientMessage(id, VKEK, string);
      }
                else SendClientMessage(playerid, HIBA, \"Nincs ilyen játékos!\");
   }
   else SendClientMessage(playerid, HIBA, \"Minimum 1-es szintû adminnak kell lenned!\");
}
else SendClientMessage(playerid, HIBA, \"Be kell jelentkezned!\");
}
return 0;
}
Cím: Crashelés parancsnál
Írta: Zsolesszka - 2012. június 27. - 19:55:25
Az fwrite függvény crashel ha nem sikerült az fopen-nek megnyitnia a számára megadott fájl elérési útvonalat.
Ezért mindig le kell ellenõrizni hogy sikerült-e megnyitni a fájlt.
 
new File:test = fopen(\"teszt.txt\", io_write);
if(test)
{
    print(\"A fájl megnyitása sikeres.\");
} else {
    print(\"A fájl-t nem sikerült megnyitni.\");
    // Ebben az esetben crashel a samp, ha fwrite van használatban.
}
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 27. - 19:58:29
Az élet parancsban nincs file kezelés.
Cím: Crashelés parancsnál
Írta: TengeriMalac - 2012. június 27. - 20:03:32
Idézetet írta: tudvari date=1340819909\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"23403\" data-ipsquote-contentclass=\"forums_Topic
Az élet parancsban nincs file kezelés.
 
de a log szerint az miatt crashelt a szerver.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 27. - 20:08:22
Hát de nem tudom,mert pl.: a frakció parancsban sincs fájlkezelés,és pont akkor crashel a szerver,amikor beírja valaki a parancsot.De ez teljesen véletlen,hogy éppen melyik parancstól fog crashelni.
Cím: Crashelés parancsnál
Írta: Zsolesszka - 2012. június 27. - 23:53:01
A legelsõ postban benne van miért crashelt a szerver.
Azon nem tudom mit nem lehet megérteni.
 
Idézetet írta: tudvari date=1340742800\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"23403\" data-ipsquote-contentclass=\"forums_Topic
Sziasztok,eddig nem volt ilyen hiba a szerveremen,de most van:
Random parancsoktól crashel a szervermvan amikor mûködik,van amikor meg crashel tõle.
Pl.: /elet-tel a hp-mat 100-ra akarom rakni.Crashel.
Resi után már nem crashel,de utána a meg a frakció módosítástól.Resi után már az is mûködik.Szóval nem tudom mi a logika a crashek között.
[22:37:45] [debug] Server crashed while executing loginom.amx
[22:37:45] [debug] AMX backtrace:
[22:37:45] [debug] #0  native fwrite () [00405710] from samp-server.exe
[22:37:45] [debug] #1  000015f8 in ?? () from loginom.amx
[22:37:45] [debug] #2  00001868 in ?? () from loginom.amx
[22:37:45] [debug] #3  00046468 in public AutomatikusMentes () from loginom.amx
[22:37:45] [debug] System backtrace:
[22:37:46] [debug] #0  00491f90 in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
[22:37:46] [debug] #1  0040534e in ?? () from C:\\Users\\Tici\\Desktop\\Programozás\\0.3eTELJES\\samp-server.exe
Ezt írja crashdetect.Automatikus Mentes-ben nem lehet hiba,mert azt gyakran lefuttatja,és akkor kb 10 mp után crashelnie kellet volna.
Ui.: mindig ezt írja ki,még ha más parancsnál crashel,akkor is.
 
A crash oka az automatikus mentés dolog  \"public AutomatikusMentes()\".
Ott egy native funkcióra jelzi a hibát mégpedig az \"fwrite\".
Ennek az okát leírtam egy korábbi hozzászólásban.
Az hogy most te próbálod összekötni abszolút nem a hiba okához való parancsok használatával, azzal csak a te dolgodat nehezíted meg.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 28. - 07:34:04
Azt nem értem,hogy igaz,hogy nem írtam if(fexist-et stb,de elõtte a timerben van az az if,hogy if(Belepve[playerid] == 1),és ez meg csak akkor 1,ha be van lépve,és cska akkor léphet be ha regisztrálva van,vagyis van fájl.És kilépéskor automatikusan 0 lesz a playerid Belepve változója.
Csak annyit kell csinálnom,hogy a timerhez rakjam be,hogy if(fexist - mentsen , if(!fexist - ne csináljon semmit?
Cím: Crashelés parancsnál
Írta: Zsolesszka - 2012. június 28. - 17:26:58
Az \"AutomatikusMentes\" mentés részbe írd bele.
Az hogy nem érted attól még a probléma fennáll, elõfordulhat hogy pont az ottani fájlmegnyitás rész pontatlan, oda írd bele az ellenõrzést.
De ha ide másolod azt a részt (\"AutomatikusMentes\")talán többet tudok mondani, míg csak te látod mi van ott, addig más nem tud segíteni.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 28. - 17:36:16
http://pastebin.com/A0a5gcDs
Cím: Crashelés parancsnál
Írta: Zsolesszka - 2012. június 28. - 17:54:49
Csoda hogy nem füstöl el a winchester.
Olyan 10 játékos létszámnál nincs lagg egy pöttyet?
Cseréld le a dini fájl kezelést valami egyszerûbbre.
Korábban írtam én valami szöszenetet valamilyen topicban, miszerint:
Minek mentesz olyan adatot ami nem változott meg? (valami technika ördöge felülírta valami hamis adattal talán)
Cseréld le mysql-re vagy valami gyorsabb adatmentésre az egészet.
A dini fájl kezelés egy katasztrófa.
Egyetlen egy adatsor átírása a következõbõl áll:
fájl megnyitás olvasásra
azonosítósor keresés
közben .part kiterjesztéssel újra írja a meglévõ fájlt soronként
ha megtalálta az azonosító sort akkor az új adattal felülírja értékét
törlés az eredeti fájlnak
majd az egész .part kiterjesztésû fájlt vissza írja eredeti állapotába
törlés a .part kiterjesztésû fájlnak.
Na szóval mivel törli az eredeti fájlt akkor elõfordulhat könnyedén hogy a következõ adatfelülírás már nem tudja megnyitni.
Egy szó mint száz, dinivel ennyi adatfelülírás egyszerre ilyen hibákat eredményez.
Javaslat:
Mivel úgyis az egész fájl tartalmát írod újra, ne használj dini-t, maradj a sima format, fopen, fwrite, megoldásnál.
Ez még mindig gyorsabb mint a dini.
Mivel csak törlöd az eredeti fájlt és létrehozod az újat minden adattal.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 28. - 18:02:33
Leírnád pls,hogy hogy kell normális módszerrel floatot,intet és stringet menteni ? köszi +1
Cím: Crashelés parancsnál
Írta: Zsolesszka - 2012. június 28. - 19:07:56
   format(filestr, sizeof(filestr, \"Adatbazis/Karakterek/%s.ini\", nev);
new
File:playerfile = fopen(filestr, io_write);
if(playerfile)
{
format(filestr, sizeof filestr, \"Pénz=%d\", JatekosInfo[playerid][Penz]);
fwrite(playerfile, filestr);
format(filestr, sizeof filestr, \"Pont=%d\", GetPlayerScore(playerid));
fwrite(playerfile, filestr);
format(filestr, sizeof filestr, \"Munka=%d\", JatekosInfo[playerid][Munka]);
fwrite(playerfile, filestr);

 

   format(filestr, sizeof(filestr, \"Adatbazis/Karakterek/%s.ini\", nev);
new
File:playerfile = fopen(filestr, io_write);
if(playerfile)
{
format(filestr, sizeof filestr, \"Pénz=%d\\r\\nPont=%d\\r\\nMunka=%d\",
   JatekosInfo[playerid][Penz],
   GetPlayerScore(playerid),
   JatekosInfo[playerid][Munka]);
fwrite(playerfile, filestr);

 
És hogy még jobban elvegyem a kedved a dini túlzott használatától.
A jelenlegi adatmentésed egyszeri alkalommal való lefutásakor, olyan 150 adatsort számoltam körülbelül ezt veszem alapul, tehát:
300 fájlmegnyitással
300 fájlbezárással
150 fájltörléssel
300 fájllétrehozással (150 .part és 150 eredeti kiterjesztéssel (ha jól láttam akkor .ini)
jár, és azt újból megemlítem hogy ez egyszeri lefutás alkalmával történik.
Ha ezt megtetézed egy idõzítõvel és egy 10 online játékossal.
Akkor egy perces ismétlõdéssel 10 játékos esetében, 10 darab regisztrációs fájl percenként
3000 fájlmegnyitással
3000 fájlbezárással
1500 fájltörléssel
3000 fájllétrehozással (1500 .part és 1500 .ini) jár, és ez csak a játékos adatai, és láttam ott valami jármû adatmentést is.  :D :D


És akkor ha a fenti módszerre átírod (hagyományos módszer) szintén 10 játékos egy perces ismétlõdéssel számolva:
10 fájlmegnyitás
10 fájl újraírás
10 fájlbezárással jár percenként.
Cím: Crashelés parancsnál
Írta: tudvari - 2012. június 28. - 20:34:13
Köszönöm a felvilágosítást :D El is kezdtem átírni.Csak a reg,login és a kilépéskor való mentés marad így szerintem.
Ui.: a timer 5 mp-nként ment xd