C++ - Enum verursacht crash

12/07/2014 14:30 Lee Ki-Hwan#1
Hey leute,
ich arbeite grad an einer Engine und dort wollte ich mal ein Enum hinzufügen zu einer vorhanden Liste von Enums.
Das sieht dann so aus:
Code:
        ENUM_11 = 11,
	ENUM_12= 12,
	ENUM_TOTAL= 13,
Vorher ging es nur bis ENUM_11 und ENUM_TOTAL war 12, ich starte das Game beim ersten mal geht es (der Enum wird noch nirgends benutzt) dann restarte ich das Spiel und es startet sich kurz dann gibts nen Error vom Client.
Jetzt mal zu der eigentlichen frage, wenn ich das alles mit Visual Studio starte also per F5, dann passiert kein Fehler und es geht.
Ich hab versucht auf Debug zu Compilen und es hat auch nichts gebracht, nun wollt ich wissen was setzt der Debugger da für Flags das es geht?
Es muss ja ein Grund haben warum es in VS geht und normal im Release/Debug nicht.
Gruß
12/07/2014 14:43 Dr. Coxxy#2
wird vermutlich i-wo ne for schleife gehen die von 0 bis ENUM_TOTAL geht und da i-etwas macht, was dann vermutlich beim letzten failt, musst du mal guckn.
ansonsten kannste auch so nen debugger @ runtime ranhängen und einfach nachgucken wos crasht.
12/07/2014 14:55 Lee Ki-Hwan#3
Quote:
Originally Posted by Dr. Coxxy View Post
wird vermutlich i-wo ne for schleife gehen die von 0 bis ENUM_TOTAL geht und da i-etwas macht, was dann vermutlich beim letzten failt, musst du mal guckn.
ansonsten kannste auch so nen debugger @ runtime ranhängen und einfach nachgucken wos crasht.
Hab alles mit breakpoints versetzt es wird nirgendswo gecallt bis man nicht ingame komme und das Inventar aufmacht :D
12/07/2014 15:01 Dr. Coxxy#4
vllt gibts im client i-wo nen hash check ob das spiel modifiziert wurde, der ignoriert wird wenn nen debugger dranhängt?
12/07/2014 18:01 MrSm!th#5
Das wäre ja ein sehr nützlicher Schutz gegen Modifikationen. ;O

Arbeitetet der Code, den du kompilierst, mit anderen Binaries zusammen? Also welche, die du nicht selbst kompilierst? Wenn ja, ist ihnen die Enum bekannt und verwenden sie diese?
Enums haben an sich keine garantierte, feste Größe. "Crash" ist zwar keine sehr detallierte Fehlerbeschreibung, aber wenn es wirklich einfach nur abstürzt, klingt das nach einer ungefangenen Exception und das sind bei nativen Anwendungen meistens falsche Speicherzugriffe. Ich könnte mir vorstellen, dass die Enum durch deine Ergänzung (oder vielleicht einfach, weil du einen anderen Compiler nutzt) eine andere Bytegröße zugewiesen bekommen hat und deswegen irgendwo ein Zugriff auf eine Variable des Typs dieser Enum nicht mehr funktioniert.

Mehr fällt mir bei diesen dürftigen Informationen jetzt nicht ein. Geht es um ein Open Source Spiel oder ist es vollständig von dir?

Quote:
dann gibts nen Error vom Client.
Was für einen?
12/07/2014 19:57 Lee Ki-Hwan#6
Quote:
Originally Posted by MrSm!th View Post
Das wäre ja ein sehr nützlicher Schutz gegen Modifikationen. ;O

Arbeitetet der Code, den du kompilierst, mit anderen Binaries zusammen? Also welche, die du nicht selbst kompilierst? Wenn ja, ist ihnen die Enum bekannt und verwenden sie diese?
Enums haben an sich keine garantierte, feste Größe. "Crash" ist zwar keine sehr detallierte Fehlerbeschreibung, aber wenn es wirklich einfach nur abstürzt, klingt das nach einer ungefangenen Exception und das sind bei nativen Anwendungen meistens falsche Speicherzugriffe. Ich könnte mir vorstellen, dass die Enum durch deine Ergänzung (oder vielleicht einfach, weil du einen anderen Compiler nutzt) eine andere Bytegröße zugewiesen bekommen hat und deswegen irgendwo ein Zugriff auf eine Variable des Typs dieser Enum nicht mehr funktioniert.

Mehr fällt mir bei diesen dürftigen Informationen jetzt nicht ein. Geht es um ein Open Source Spiel oder ist es vollständig von dir?

Was für einen?
Ist ein älteres MMO von Koreaner programmiert und nein es ist nicht Open-Source.
Also du hast aufjedenfall recht mit deiner Aussage es ist eine ACCESS_VIOLATION exception.

Ich frage mich aber warum funktioniert es mit VS6 tadellos (im Debug modus).
Und ja ich arbeite mit mehreren Binaries und ich hab überall geguckt und breakpoints gesetzt ich wollte wissen ob der Enum irgendwo aufgerufen wird, aber das ist nicht der fall.

Es ist komisch das es manchmal geht und manchmal nicht.
Dazu kommt noch wenn es dann geht, funktioniert der EXIT button im Login-Interface nicht mehr, wobei ich nur ein Enum hinzufüge für das Inventar/Rüstungen..

Im code wird das meistens mit einem Loop verwendet um dann den aktuellen "wearing status" zu setzen, sprich am anfang wird geloopt und alles auf NULL gesetzt, das funktioniert auch, aber danach crasht der Client direkt und das in irgendeiner Funktion die nichts damit zutun hat, diese Funktion setzt einfach einen String im Interface, z.B den Klassen-Namen.

Ich weiss nicht wo ich anfangen soll :p
12/08/2014 17:01 MrSm!th#7
Ich glaube, auf einer so abstrakten Stufe wird das nichts. Da müsste man schon konkreter wissen, was das für ein Enum ist und wie es wo verwendet wird. Ich glaube ohne Einsicht in den Code kann man da wenig "debuggen".
Du könntest mal die Exception catchen und die Adresse, an der sie auftritt, sichern. Dann mit einem Debugger wie Olly zur Laufzeit attachen und schauen, was da vor sich geht.
12/18/2014 16:27 Lee Ki-Hwan#8
Das Problem ist ich finde nichtmal wo ich die Exception catchen müsste.
Visual Studio 6 zeigt irgendwelche Funktionen wie GetStringFromID(int id),
das ist aber eher unwahrscheinlich da genau das klappt mit der selben ID ect wenn der Enum draussen ist :p

Und dazu kommt noch das es irgendwie manchmal Funktioniert und manchmal nicht, also ab und zu starte ich einfach die .exe und es geht alles (bis auf den Exit button der funzt dann irgendwie nicht mehr) es is schon gewaltig komisch aber naja, ich versuch nacher mehr in Erfahrung zu bringen wird aber wohl erst morgen gehen können.

Ich werde nacher mal Code snippets reinmachen, vielleicht hilft es.