Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / Engine crash treibt mich noch in den Wahnsinn.
- - By Pitri (More than 200 posts.) Date 28.04.2014 01:47 Edited 28.04.2014 01:54
Hey, Leute.
Ich bräuchte etwas Hintergrundwissen. Hat wer eine Ahnung, durch was die Warnung "WARNING: Unexpected value "Status"! (in section "Response", after line 1, Round Results)" ausgelöst wird und was da genau kaputt ist?

Ich arbeite momentan flüchtig am Remake eines kleinen Melees. Das Problem war allerdings, dass bei Beendigung die Engine scheinbar randomly bei den Leuten abgeschmiert ist: "Clonk Rage funktioniert nichtmehr!". Es tauchte nicht nicht beim GameOver() der Runde oder Beginn der Auswertung auf, sondern immer erst beim Wegklicken der Auswertung. Ich habe mich eben mit Scaba ein wenig dran gesetzt und zusammen haben wir daran herumanalysiert, systematisch einzelne Bestandteile des Szenarios gelöscht und weiterprobiert. Was wir herausgefunden haben:
• Die Engine crasht nur bei den Spielern, die verloren haben.
• Die Datei des Scoreboardscripts ist schuld.
• Allein die Existenz der von mir definierten globalen Funktion UpdateScoreboard(plr) sorgt dafür, dass der Crash passiert.
• Der Inhalt von UpdateScoreboard(plr) wurde von uns komplett auskommentiert.
• UpdateScoreboard(plr) muss dazu nicht einmal aufgerufen werden.
• Jedes mal taucht die oben geschriebene Warnung im Clonk.log auf.
• Auf Verdacht habe ich mal in einem neuen Szenario mit LocateFunc() geschaut, ob UpdateScoreboard() nicht schon in der Engine oder sonst wo definiert wurde. Computer sagt nein.

Hat irgendwer eine Ahnung, was die Engine da für Probleme hat?
Parent - - By Luchs (More than 1000 posts.) Date 28.04.2014 07:44
Die Warnung klingt nach einem Problem mit der Masterserver-Kommunikation. Nach Rundenabschluss senden ja alle Clients ihre Ergebnisse an den Masterserver, wobei eben eine Sektion [Response] mit dabei ist. Ihr verwendet aber schon den clonk.de Server, bei dem alles funktionieren müsste?
Parent - By scaba (More than 200 posts.) Date 28.04.2014 14:01

>Ihr verwendet aber schon den clonk.de Server, bei dem alles funktionieren müsste?


Wir haben bei unseren Tests den ganz normalen clonk.de-Masterserver verwendet.
Parent - By Pitri (More than 200 posts.) Date 29.04.2014 11:58 Edited 29.04.2014 12:02
Okay, das Problem ist gelöst. Schuld daran war nicht die Existenz von UpdateScoreboard(), sondern ein Versuch, auf ein bereits gelöschtes Objekt mit AddEffect() zuzugreifen. If-Verschachtelungs-Fail. UpdateScoreboard() hat nur mitgemischt, da durch das nicht vorhanden sein Errors ausgelöst wurden, wodurch der Code nicht bis zum Ende durchlaufen konnte und die kritische Stelle nicht erreicht hat.
Ich finde es trotzdem krass, dass nur die Verlierer einen Crash bekommen haben. x)

An dieser Stelle nochmal herzlichen Dank an Scaba und Kanibal!
- - By DMan (More than 200 posts.) Date 30.04.2014 19:00
Wenn wir schon bei Engine-Crashs sind: Mich würde interessieren, warum Clonk immer und bei jedem nach einer abgeschlossenen Runde "Kasernenstadt II" crasht. Kann man das nicht mal irgendwie beheben?
Parent - - By Kanibal (More than 200 posts.) Date 30.04.2014 21:55
Das Szenario einmal mit einer Debug-Engine spielen; entweder Du selbst oder ein Mitspieler, der Clonk Rage als Debug-Build hat :tongue:
Parent - - By DMan (More than 200 posts.) Date 01.05.2014 08:10
"Debug-Engine"? Ist damit gemeint, den Debug-Modus zu aktiveren?
Parent - - By Luchs (More than 1000 posts.) Date 01.05.2014 08:39
Nein, das ist eine speziell kompilierte Engine, die nicht nur den Maschinencode enthält, sondern auch Information, zu welcher C++ Codezeile die einzelnen Anweisungen gehören. Wenn Clonk dann crasht, kann man mithilfe eines Debuggers den Zustand beim Crash analysieren. Ein häufiges Problem ist etwa der Zugriff auf einen ungültigen Speicherbereich, was so zumindest leicht erkennbar ist.
Parent - - By DMan (More than 200 posts.) Date 01.05.2014 09:35
Und wo bekomm ich diese Engine her? Eine bauen kann ich zumindest (noch) nicht.
Parent - - By Newton (More than 50 posts.) Date 01.05.2014 10:34
Du brauchst dann auch einen Debugger wenn du debuggen willst. Jede anstaendige Entwicklungsumgebung hat einen Debugger integriert, aber wenn du eine Entwicklungsumgebung (wie etwa Visual Studio) hast, dann kannst du auch selbst eine Debug-Engine kompilieren.
Parent - - By DMan (More than 200 posts.) Date 01.05.2014 10:45

>entweder Du selbst oder ein Mitspieler, der Clonk Rage als Debug-Build hat.


Dann spiel ich doch lieber mit jemanden, der das hat. Habe weder die nötige Software noch die Kenntnisse. Hat von jenen jemand Zeit?
Parent - - By Kanibal (More than 200 posts.) Date 01.05.2014 14:37
Ja - schlag mal nen Termin vor :-)
Parent - - By DMan (More than 200 posts.) Date 01.05.2014 14:45
Cool von dir. :)
Also ich hätte heute noch Zeit, wann würde es dir denn passen?
Parent - - By Kanibal (More than 200 posts.) Date 01.05.2014 16:18
Schreib mich am besten einfach im IRC an #clonk oder #clonkscript. Wenn ich innerhalb von 3 Minuten antworte, dann hab ich Zeit :-)
Parent - By DMan (More than 200 posts.) Date 01.05.2014 18:20
Sry Kanibal, mir kam was wichtiges dazwischen. Ich versuche dich morgen oder irgendwo in o. g. Channels zu erwischen. Danke schonmal im Voraus!

Edit: 18:18 Uhr und 20:20 Uhr. :>
Parent - - By scaba (More than 200 posts.) Date 30.04.2014 22:42
Hilfreich wäre auf alle Fälle mal das Log.
Parent - - By DMan (More than 200 posts.) Date 01.05.2014 08:10
Ich probier's mal heute zu spielen. Geht das auch lokal oder muss jemand über das Netzwerk mitspielen?
Parent - - By Luchs (More than 1000 posts.) Date 01.05.2014 08:40
Naja, wenn es lokal auch crasht geht es auch lokal ;)
Parent - - By DMan (More than 200 posts.) Date 01.05.2014 09:35
Ich wollte nur wissen, ob das mit dem Log dann auch funktioniert oderso.
Parent - By Luchs (More than 1000 posts.) Date 01.05.2014 10:02
Ja, es wird normalerweise immer ein Log erzeugt.
Parent - - By Mupf (More than 200 posts.) Date 01.05.2014 15:18
Es gibt Menschen die noch Kasernenstadt II spielen wollen? \o/
Parent - By DMan (More than 200 posts.) Date 01.05.2014 18:20
Wenn's nicht dauernd crashen würde, würd ich es täglich spielen! \o/
Parent - - By Jan (More than 50 posts.) Date 02.05.2014 16:44 Edited 02.05.2014 16:50
Hab mir den Fehler mal angeschaut: Der Engine-Crash kann immer dann auftreten, wenn ein Objekt den Inhalt seines Containers bearbeitet während er gelöscht wird. Ein Beispiel:
Man hat ein Container-Objekt container und zwei Inhaltsobjekte contents1 und contents2. contents1 hat in seinem Script einen Destruction()-Callback der das contents2-Objekt aus dem Container herausholt:

protected func Destruction() { FindObject(CTS2)->Exit(); }

Das Szenarioscript sieht wie folgt aus:

func Initialize()
{
  var container = CreateObject(CTNR, 0, 0, NO_OWNER);
 
  // Reihenfolge muss manchmal vertauscht werden
  container->CreateContents(CTS1);
  container->CreateContents(CTS2);
 
  container->RemoveObject();
}


Dann passiert Folgendes:
1) C4Object::AssignRemoval() wird für container aufgerufen, es ist also this==container.
2) Darin wird die verkettete Liste der Inhaltsobjekte durchlaufen und die Objekte entfernt, indem C4Object::AssignRemoval() rekursiv für diese Objekte aufgerufen wird.
3) clnk zeigt jetzt auf das Contents-Listenelement für contents1 und next auf das für contents2.
4) Man befindet sich also wieder in C4Object::AssignRemoval(), diesmal aber für this==contents1.
5) Darin wird der Destruction()-Scriptcallback aufgerufen.
6) Destruction() ruft Exit(contents2) auf, wodurch C4ObjectList::Remove(contents2) ausgeführt wird.
7) Dort wird das Element für contents2 aus der Contents-Liste entfernt und freigegeben.
8) Wieder zurück in C4Object::AssignRemoval() für this==container, aber diesmal im nächsten Schleifendurchlauf. Hier wird nun clnk=next ausgeführt.
9) next wurde in 3) auf das Contents-Listenelement von contents2 gesetzt. In 7) wurde es aber freigegeben!
10) Ab hier sollte nun irgendwann die Engine abstürzen, da versucht wird, den Zeiger auf contents2 aus dem freigegebenen Listenelement zu lesen.

Um den Fehler zu beheben muss die Schleife zum Entfernen der Inhaltsobjekte bei jedem Durchlauf wieder von vorne anfangen (da die Liste ja durch Scriptcallbacks verändert worden sein könnte):

// Kill contents
C4Object *cobj; C4ObjectLink *clnk,*next;
while ((clnk = Contents.First) && (cobj = clnk->Obj))
{
  next = clnk->Next;
  if (fExitContents)
  {
    cobj->Exit(x, y);
  }
  else
  {
    Contents.Remove(cobj);
    cobj->AssignRemoval();
  }
}


Eine andere Lösung (zumindest für das Szenario) ist, den Scriptbug zu beheben, der zu dem Enginefehler führt: Im Szenarioscript wird beim Relaunch nicht geprüft, ob der aktuelle Spieler noch lebt. Das lässt sich beheben indem man
if (!GetPlayerName(iPlr)) return;
in die erste Zeile von RelaunchPlayer() schreibt.
Parent - - By Mupf (More than 200 posts.) Date 02.05.2014 17:01
Ui, dass ich damals sowas fundamentales vergessen hab.. :sad:
Gibt es noch mehr konkrete Änderungswünsche?
Ich würde das ganze dann mal updaten, da ja Nachfrage zu bestehen scheint.
Parent - By DMan (More than 200 posts.) Date 05.05.2014 19:45 Edited 05.05.2014 19:50
\o/
Könnt's ja demnächst nochmal spielen aber bisher ist das Game echt verdammt nice. :o

Edit:
Hab früher immer gern mit dem Raketenwerfer gespammt, weil der so imba ist und man nicht mal stirbt, wenn man mit dem Ding auf den Boden unter sich schießt, wenn dabei ein anderer Spieler getötet wird. :tongue:
Und ab und zu kann man den Schnee nicht weggaben und ich hab kA, warum. :s
Parent - By DMan (More than 200 posts.) Date 18.08.2014 21:20
Wie sieht's aus? :D

Hab aber ein paar Bugs
Hazard_Weapons1.6.c4d...
   [...]
   Raketen (MIAP) überladen.
   Raketen (MIAM) überladen.
WARNING: Unexpected value "CanDig"! (in section "DefCore", after line 0, Hazard_Weapons1.6.c4d\HazardClonk.c4d\DefCore.txt)
   HazardClonk (HZCK) überladen.
   Killstatistik (HHKS) überladen.
   [...]
  48 Definitionen geladen.
Kasernenstadt 2v1.9.6.c4s...
   Spielregelwahl (CHOS) überladen.
ERROR: '}' expected, but found identifier (in Damage, Kasernenstadt 2v1.9.6.c4s\GasBottle.c4d\Script.c:30:13)
   Gasflasche (GSBO) überladen.
   Ein neues Objekt (ENAM) überladen.
   Ein neues Objekt (GSAM) überladen.
  6 Definitionen geladen.
ERROR: direct object call: function ConDesc not found (in ContextUseEquipment, Hazard.c4d\Libraries.c4d\Functionalities.c4d\UseGear.c4d\Script.c:83:34)
ERROR: direct object call: function ConUse not found (in UseEquipment, Hazard.c4d\Libraries.c4d\Functionalities.c4d\UseGear.c4d\Script.c:167:21)
ERROR: direct object call: function ConDesc not found (in ContextUseEquipment, Hazard.c4d\Libraries.c4d\Functionalities.c4d\UseGear.c4d\Script.c:83:34)
  (as #appendto/#include to Hazard_Weapons1.6.c4d\HazardClonk.c4d\Script.c)
ERROR: direct object call: function ConUse not found (in UseEquipment, Hazard.c4d\Libraries.c4d\Functionalities.c4d\UseGear.c4d\Script.c:167:21)
  (as #appendto/#include to Hazard_Weapons1.6.c4d\HazardClonk.c4d\Script.c)
WARNING: Error getting Action TimeOver: StartCall function 'BlowUp' (Hazard_Weapons1.6.c4d\Weapons.c4d\GrenadeLauncher.c4d\Splitgrenade.c4d\Script.c)

C4AulScriptEngine linked - 57395 lines, 1 warning, 4 errors
[...]
Erstellung der Landschaft...
ERROR: Object loading(section "Object", after line 61): Objekt vom Typ GT8D nicht platziert.
ERROR: Object loading(section "Object", after line 124): Objekt vom Typ GT8D nicht platziert.
ERROR: Object loading(section "Object", after line 144): Objekt vom Typ GT8D nicht platziert.
ERROR: Object loading(section "Object", after line 184): Objekt vom Typ GT8D nicht platziert.
ERROR: Object loading(section "Object", after line 222): Objekt vom Typ GT8D nicht platziert.

[...]
Spiel gestartet.
Spielerbeitritt: [FP] DManstrator
ERROR: expression expected, but found end of file (eval in Hazard.c4d\Structural.c4d\Furniture.c4d\Lights.c4d\AlertLight.c4d\Script.c:0:0)
ERROR: expression expected, but found end of file (eval in Hazard.c4d\Structural.c4d\Furniture.c4d\Lights.c4d\AlertLight.c4d\Script.c:0:0)
ERROR: expression expected, but found end of file (eval in Hazard.c4d\Structural.c4d\Furniture.c4d\Lights.c4d\AlertLight.c4d\Script.c:0:0)
ERROR: expression expected, but found end of file (eval in Hazard.c4d\Effects.c4d\Light.c4d\Script.c:0:0)
ERROR: expression expected, but found end of file (eval in Hazard.c4d\Effects.c4d\Light.c4d\Script.c:0:0)

[FP] DManstrator wählt jetzt die Spielkonfiguration, bitte noch etwas Geduld
[...]
ERROR: Object call: target is zero!
by: ResetCH() (obj Marik #2174) (Hazard_Weapons1.6.c4d\Weapons.c4d\Weapon.c4d\HazardAppend.c4d\Script.c:220)
by: UpdateCharge() (obj Marik #2174) (Hazard_Weapons1.6.c4d\Weapons.c4d\Weapon.c4d\HazardAppend.c4d\Script.c:100)
by: Ejection(Granatenpack #2281) (obj Marik #2174) (Hazard_Weapons1.6.c4d\HazardClonk.c4d\Script.c:2620)
by: DoDmg(80,2,Marik #2174,1) (obj Projektil #2463) (Hazard_Weapons1.6.c4d\System.c4g\Damage.c:52)
by: BulletStrike(Marik #2174) (obj Projektil #2463) (Hazard.c4d\Items.c4d\Weapons.c4d\Weapon.c4d\Shot.c4d\Script.c:198)
by: HitObject(Marik #2174) (obj Projektil #2463) (Hazard.c4d\Items.c4d\Weapons.c4d\Weapon.c4d\Shot.c4d\Script.c:191)
by: FxHitCheckTimer(Projektil #2463,1,1) (def Projektil) (Hazard.c4d\Items.c4d\Weapons.c4d\Weapon.c4d\Shot.c4d\Script.c:289)

<c 16dff>[FP] DManstrator</c> (<c f40000><Team 1></c>) hatte <c ffffff>Tester</c> (<c c800><Team 2></c>) direkt im Visier.


Letzterer Error wurde durch einen Kill mit einer Waffe, die Schrotflintenpatronen benutzt, erzeugt.

Hatte die Kasernenstadt 2v1.9.6.c4s (Sebastian Müller) gehostet, weil diese eine Beachreibung der Waffen hatte. Habe auch noch Kasernenstadt 2.c4s (Sebastian Müller) und Kasernenstadt 22.c4s (Kai Doerflinger).
Parent - By DMan (More than 200 posts.) Date 27.09.2014 19:40
So close..
Up Topic Deutsch / Hilfestellung / Engine crash treibt mich noch in den Wahnsinn.

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill