WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Det skummaste problemet jag någonsin stött på (C#) (https://www.wn.se/forum/showthread.php?t=1055125)

yakuzaemme 2012-09-26 00:27

Det skummaste problemet jag någonsin stött på (C#)
 
Tjena. Är spelutvecklare och jobbar just nu på serverdelen. Allt har flytit på bra men nu på senare dagar har jag skrivit om hela multithreading-systemet och nu får jag ett väldigt konstigt problem.

Alla paket som ska skickas till klienten lägger jag in i en kö för spelaren, men har nu märkt att servern skickar ut paket till alla klienter inloggade, dvs. samma paket och resulterar i att klienten hanterar paket som egentligen bara ska hanteras av en spelare.


Hur som helst, detta problem (multithreading anar jag) uppstår ENDAST när jag debuggar i Visual Studio. Om jag kör direkt från .exe så uppstår inte detta problem.

Är det Visual Studio som spökar? Har under alla mina år som utvecklare aldrig stött på detta, helskumt.


Mvh,

Conny Westh 2012-09-26 00:38

Vad kör du för projekttyp?

yakuzaemme 2012-09-26 00:52

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20451586)
Vad kör du för projekttyp?

Hur menar du?

yakuzaemme 2012-09-26 01:19

Update:

Verkar som att det är mitt VS som spökar. Testade att kompilera det på min laptop (VS 2012), och det fungerar felfritt. Försöker jag på min stationära (VS Express 2010) återstår buggen.

Conny Westh 2012-09-26 01:34

Citat:

Ursprungligen postat av yakuzaemme (Inlägg 20451590)
Hur menar du?

Kör du webforms, Winforms, Console application, eller någon annan variant, det finns ju en uppsjö av varianter att välja på....

yakuzaemme 2012-09-26 02:02

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20451594)
Kör du webforms, Winforms, Console application, eller någon annan variant, det finns ju en uppsjö av varianter att välja på....

Jasså, du menade så. Basen för spelservern är Console Application givetvis, och så launchar jag en WinForm som fungerar som kontrollpanel.

Socketsystemet & authservern skriven i ren C#, dekrypterar auth-datan och skickar vidare till spelservern. Verkar få samma data (förutom id och så) från authdelen, så den verkar vara bra.

Socketsystemet lyssnar av på authportarna, hanterar onConnect och onReceive.

Dekrypterar auth-paketet (se kod nedan) och gör kontroller om allt verkar som det ska. Allt detta verkar fungera felfritt och det skickas vidare till spelservern.

Kod:

public void Decrypt(Byte[] rgb)
        {
            if (rgb == null)
                throw new NullReferenceException("Buffer can't be null!");

            Int16 K = COSAC_IV / 2;
            if (m_BufKey != null)
                K = COSAC_KEY / 2;

            for (Int32 i = 0; i < rgb.Length; i++)
            {
                rgb[i] ^= (Byte)0xAB;
                rgb[i] = (Byte)(rgb[i] >> 4 | rgb[i] << 4);
                if (m_BufKey != null)
                {
                    rgb[i] ^= (Byte)(m_BufKey[(Byte)(DecryptCounter & 0xFF) + 0]);
                    rgb[i] ^= (Byte)(m_BufKey[(Byte)(DecryptCounter >> 8) + K]);
                }
                else if (m_BufIV != null)
                {
                    rgb[i] ^= (Byte)(m_BufIV[(Byte)(DecryptCounter & 0xFF) + 0]);
                    rgb[i] ^= (Byte)(m_BufIV[(Byte)(DecryptCounter >> 8) + K]);
                }
                DecryptCounter++;
            }
        }


Skickar senare somsagt vidare till spelservern, lyssnar av vilka paket som kommer från klient>server, lägger till dem i kö för den rätta användaren och så låter jag pakethanteraren ta hand om det. Båda klienterna loggas in normalt, men när någon av dem skickar ett nytt paket (klient>server), som servern ska hantera och styra vad klienten ska göra (exempelvis röra sig, attackera, skriva eller dylikt) så händer detta på alla klienter.

Kod:

public static void OnPlayerReceive()
        {
            foreach (Connection con in Program.GameConnections.Values)
            {
                con.DoQueueSend();

                Byte[] mData;
                if (con.ReceiveQueue.TryDequeue(out mData))
                {
                    Program.Tasks.StartNew(()
                        => Packets.Delegates.PacketHandles[BitConverter.ToUInt16(mData, 2)](mData, con));
                }
            }
        }


Här verkar det strula. Om jag kompilerar i VS Express 2010 så skickas paket ut till alla klienter anslutna, om jag kompilerar i VS Express 2012 så sker allt rätt till, dvs. att rätt paket går till rätt klient.


VS 2010 (Express) körs på .NET Framework 4.0, precis som VS 2012. Använder multithreading över hela spelservern, mycket LINQ i pakethanterar-delen.

Conny Westh 2012-09-26 02:22

Kan du ordna en testrigg som innehåller det minimala för att återskapa problemet så jag kan testa debuggingen i min VS2010-miljö?

Jag skulle i vart fall kapa ner allt runtomkring och testa mig fram tills jag definitivt kan isolera problemet i ett första steg. Jag kör normalt inte VS Express utan VS Professional 2010 f.n. men om du kan fixa en testrigg så kanske jag kan hjälpa till att sätta fingret på problemet ändå. Det är ju enklare med 4 ögon än 2.

yakuzaemme 2012-09-26 02:41

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20451596)
Kan du ordna en testrigg som innehåller det minimala för att återskapa problemet så jag kan testa debuggingen i min VS2010-miljö?

Jag skulle i vart fall kapa ner allt runtomkring och testa mig fram tills jag definitivt kan isolera problemet i ett första steg. Jag kör normalt inte VS Express utan VS Professional 2010 f.n. men om du kan fixa en testrigg så kanske jag kan hjälpa till att sätta fingret på problemet ändå. Det är ju enklare med 4 ögon än 2.

Önskar att jag kunde, men kan inte skala ner någonting då allting är väldigt komplext uppbygt, samt innehåller massvis med krypteringsalgoritmer jag inte kan släppa då mitt spel blir mycket sårbart.

Bara källkoden ligger på ~500MB, då kanske du förstår storleken på spelet. MMORPG, ungefär som World of Warcraft (men mycket bättre ;) )


Hur som helst, tänkte om det kanske är dokumenterat att den versionen av VS jag kör på skiljer sig när det gäller LINQ, flera trådar eller annan teknik gentemot de senare versionerna (där det kompileras bra).

Det är ju något som spökar i själva kompileringsstadiet, då koden är exakt samma.

yakuzaemme 2012-09-26 06:10

Sov på problemet och har möjligtvis kommit fram till en orsak, dock inte en lösning (quickfix genom att använda 2012 istället för 2010, men vill åtgärda buggar istället för att hoppa över dem).

Till min multithreading och pakethantering använder jag den nyare delen av listtasks, TaskFactory (System.Threading.Tasks.TaskFactory).

Vad jag kan förstå finns(?) inte detta i VS Express 2010, eller var ej färdigutvecklat. Finns ju ThreadPool, som inte är lika kraftfull. Byggde stora delar av servern på min laptop (enda jag hade tillgänglig, låg inne på sjukhus) och hade tänkt fortsätta på stationära datorn.


Vad tror du Conny, kan detta vara orsaken? Det lär ju finnas någon support för listtasks då det inte ger utslag när jag öppnar projektet i VS 2010. Ska ladda ner VS 2012 på denna burk och se om det körs bra på det, återkommer.

Conny Westh 2012-09-26 07:12

Ja, det verkar troligt att det är VS 2010 Express som har en brist som är åtgärdad i VS 2012.

Jag tycker du ska uppgradera och köra på den senaste VS du kan, det brukar alltid vara bättre än att försöka lösa problem som finns i äldre verioner.

Express är ju dessutom betydligt simplare än Professional, själv använder jag alltid professional versionen.

Ett annat tips är att i möjligaste mån använda Wrapperclasser runt kritiska externa klasser, så om du behöver ändra så behöver du bara ändra på ett ställe, dett aär särskilt viktigt om du har en sås på en halv gig. hur många rader är den såsen på? Måste ha tagit en evighet att utveckla.

yakuzaemme 2012-09-26 15:28

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20451600)
Ja, det verkar troligt att det är VS 2010 Express som har en brist som är åtgärdad i VS 2012.

Jag tycker du ska uppgradera och köra på den senaste VS du kan, det brukar alltid vara bättre än att försöka lösa problem som finns i äldre verioner.

Express är ju dessutom betydligt simplare än Professional, själv använder jag alltid professional versionen.

Ett annat tips är att i möjligaste mån använda Wrapperclasser runt kritiska externa klasser, så om du behöver ändra så behöver du bara ändra på ett ställe, dett aär särskilt viktigt om du har en sås på en halv gig. hur många rader är den såsen på? Måste ha tagit en evighet att utveckla.

Hm, får väl göra det denna gång då. Aldrig varit ett fan av att hoppa över problem istället för att åtgärda dem, speciellt när det gäller Microsoft, dom har ju en tendens att inte dokumentera allting som är ändrat/uppdaterat.


Authservern ligger på runt 70k rader, spelservern på minst 20 gånger mer. Sen har vi ju hela klienten också som är mycket avancerad, skulle vilja säga att det är bättre grafik är World of Warcraft och de största MMORPG-spelen.

Fick en sjukdom för en månad sedan som har begränsat mitt liv, och därför har jag mängder med tid att syssla med detta - skulle nog säga att det tagit två månader. Bara ett projekt jag gör för att fördriva tiden :)

Conny Westh 2012-09-26 19:37

Ok, 1,4 MLOC är ju hyfsat stort system. Men du måste ha kopierat mycket för att hinna med det på 2 månader.

Jag jobbade med ett system som blev på 3,5 MLOC och det tog 30 manår för 10-15 personer att utveckla, systemet var klart på 3 kalenderår, då var 97% genererat av en kodgenerator. Men vi jobbade mycket med att trimma in och skriva om koden i mallarna flera gånger, så de första 6 månaderna skrev vi om koden och genererade om hela systemet ca 10 gånger från grunden. Sen blev det väl lite lugnare. De första 6 månaderna hade vi dock bara 50 tabeller att jobba med.

Systemet bestod av 15 delsystem och vi hade använde många egenproducerade komponenter så vi hade maximal återanvändning av redan producerad kod.

Bland annat så hade vi byggt en egen ORM (Object Relational Mapping).

Databasen bestod av 555 tabeller och det var ca 2500 klasser.

yakuzaemme 2012-09-26 19:47

Citat:

Ursprungligen postat av ConnyWesth (Inlägg 20451660)
Ok, 1,4 MLOC är ju hyfsat stort system. Men du måste ha kopierat mycket för att hinna med det på 2 månader.

Jag jobbade med ett system som blev på 3,5 MLOC och det tog 30 manår för 10-15 personer att utveckla, systemet var klart på 3 kalenderår, då var 97% genererat av en kodgenerator. Men vi jobbade mycket med att trimma in och skriva om koden flera gånger, så de första 6 månaderna skrev vi om koden ca 10 gånger från grunden. Sen blev det väl lite lugnare.

Systemet bestod av 15 delsystem och vi hade använde många egenproducerade komponenter så vi hade maximal återanvändning av redan producerad kod.

Databasen bestod av 555 tabeller och det var ca 2500 klasser.

Kopierat mycket, hur menar du? Allt är skrivet själv och skräddarsytt för spelet och klienten, det går ju hand i hand.


Nåväl, jag verkar ha hittat problemet i grunden nu. Jag har missat att det kommit .NET 4.5, och det verkar finnas någon uppdatering i TaskFactory till det. Men, vänta! Mer problem, suck..

Får inte VS 2011/2012 att installeras på min burk. Av någon anledning vill Microsoft stila sig, och givetvis går det åt skogen. Blend krashar hej vilt när jag försöker göra någon action (ladda hem, installera). Testat både web-installer och ISO-fil. Filerna verkar inte vara skadade på något sätt, utan helt enkelt Blend som krashar.


Sitter och överväger att ta bort alla VS-program jag har på datorn (väldigt många då jag sysslar med allt från mobil till web), men något annat måste det finnas att göra.. Förslag?

Conny Westh 2012-09-26 20:25

Vad jag vill ha sagt är att 700 KLOC/månad är bra jobbat!

När vi körde vårt stora prjekt så låg pacen netto (vi skrev ju om koden för att höja kvaliten ganska många gånger så brutto blir det ju många gånger mer) på ca 10 KLOC/månad/person under de 3 år det tog att bygga systemet.

Men å andra sidan är KLOC/månad inget bra mått på produktivitet utan man får titta på andra faktorer som Function Points och kvaliteten på arkitekturen också....

yakuzaemme 2012-09-26 22:12

Inget förslag på problemet i fråga? Somsagt, .NET 4.5 som är boven, kan dock inte installera VS 2012, eller något som har med Blend att göra. Hittar absolut ingenting när jag söker på felmeddelandet. Håller just nu på att ta bort alla Visual Studio-program på denna burk (och det är många, suck..). Om det inte skulle lösa problemet vet jag inte vad.


Har du något förslag? Är inte längre en C# fråga utan allmän kunskap inom Windows och/eller Visual Studio.

yakuzaemme 2012-09-27 03:54

Tror problemet blir löst under natten.

NET 4.5 var somsagt problemet, Microsoft har uppdaterat TaskFactory-klassen utan att skriva med det i dokumentationen, big surprise. Min burk verkade inte gilla Expression Blend utan krashade när jag skulle uppdatera VS, så nu sitter jag med en omformaterad dator, installationen pågår.

En lösning vore att göra en wrapper och kompilera olika men är nog bäst att följa efter Microsofts standarder och se glad ut. Packethandling är en stor del av en server så lika bra att använda de teknikerna som gör jobbet bäst.

Tackar för hjälpen Conny även om det inte gjorde någon av oss klokare, förbaskat konstigt problem. Återkommer om det strular något mer.

Conny Westh 2012-09-27 06:25

Ok, jag hade ändå inga förslag på lösning i huvudet....


Alla tider är GMT +2. Klockan är nu 05:28.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson