STR Fehlermeldung und acklog Frage

Posted By: Superku

STR Fehlermeldung und acklog Frage - 01/12/15 16:04

Sehr geehrter Herr Lotter,
zwei Fragen:
(1) Gestern trat beim Beenden meines Spiels, ohne dass ich so wirklich etwas über längere Zeit an meinem Skript änderte (stattdessen beim Leveldesignen und Testspielen) folgende Fehlermeldung auf:

Quote:
Free input,funcs,panels,defs,syns,views,strings
Malfunction W1516: Invalid memory area STR
Program aborted,vars..ok


Handelt es sich dabei um fehlerhafte str_... Operationen oder kann der String-Speicher bspw. nicht korrekt freigegeben werden, weil der Speicherbereich anderswo überschrieben worden ist (bspw. durch Überschreiten eines Arrays)?
Ist es möglich, dass eine defekte Datei beim Laden eines Levels in besagten Speicher hineinspuckt und diese Fehlermeldung verursacht?

(2) Zudem tauchten in dieser acklog-Datei, welche in etwa 8 Levelladevorgänge aufweist, zum ersten Mal drei mir vorher unbekannte "Statusberichte" auf der folgenden Form:

Quote:
LevelInit at 143.646
604 entities 0 cameras 0 lights 0 sounds 3 paths
1 lmaps 2 textures 53 meshes 53 submeshes 636 faces...ok
LevelReady at 143.968
Status at time 283.632 frame 33364 ---------
init_gamepad dg_rundes1_mdl_3866:drehform_neigung [...]
main
Maximum Time: MINE2.MDL:mine_proxy => 1.861572


Was hat das zu bedeuten und wie wird dieser Statusreport ausgelöst? Kann das u.U. sogar vorige STR Fehlermeldung auslösen (welche zuvor auch nie aufgetreten war)?
Posted By: Superku

Re: STR Fehlermeldung und acklog Frage - 01/19/15 01:32

Zu (1): Die Fehlermeldung trat nun auch ohne Statusreport und nicht beim Beenden sondern nach einem Ladevorgang auf:

Quote:
LevelInit at 226.449
397 entities 0 cameras 0 lights 0 sounds 0 paths
1 lmaps 2 textures 111 meshes 111 submeshes 1332 faces...ok
LevelReady at 226.760
Malfunction W1516: Invalid memory area STR
Program aborted
Posted By: jcl

Re: STR Fehlermeldung und acklog Frage - 01/19/15 13:09

Ja, die Meldung weist tatsächlich darauf hin, dass der Speicherbereich eines STRING von irgendeinem Skript überschrieben wurde. String-Operationen wie str_cat können das nicht sein, denn die passen den Bereich an. - Die Statusberichte sind mir auch unbekannt - könnten das eine Testroutine von Ihnen sein?
Posted By: Superku

Re: STR Fehlermeldung und acklog Frage - 01/19/15 16:51

Originally Posted By: jcl
Ja, die Meldung weist tatsächlich darauf hin, dass der Speicherbereich eines STRING von irgendeinem Skript überschrieben wurde.

Ok, danke. Kann das auch durch fehlerhafte Dateien beim Laden verursacht werden, da ich sonst nicht so recht weiß, wo ich nach der Fehlerquelle suchen soll? (Ich benutze übrigens gelegentlich das string1/2 Feature im WED für read-only Zwecke.)

Originally Posted By: jcl
Die Statusberichte sind mir auch unbekannt - könnten das eine Testroutine von Ihnen sein?

Das dachte ich auch zuerst, und zur Sicherheit habe ich gerade noch einmal per SED Supersuchfunktion meine gesamten Skripte nach "Status", "Maximum" und sonstiges durchsucht, aber nichts dergleichen finden können.
Ich kann das komplette acklog mit den Statusberichten an den Support schicken, falls das behilflich sein kann.
Posted By: jcl

Re: STR Fehlermeldung und acklog Frage - 01/26/15 13:20

Kann die Meldung vielleicht von irgendeinem Plugin oder einer externen Bibliothek kommen?
Posted By: Superku

Re: STR Fehlermeldung und acklog Frage - 12/11/15 11:03

Diese Statusnachricht tauchte eben wieder mitten in einem acklog auf, sehr merkwürdig!
Komplettes Projektverzeichnis per SED danach durchsucht, in meinem Header benutze ich nur folgendes an externen Bibliotheken:

Code:
#include <acknex.h>
#include <default.c>
#include <particles.c>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <default.c>
#include <strio.c>
#include <d3d9.h>
#include <acknet.h>




Davon unabhängig habe ich derzeit ein Problem mit meinem Code, und zwar dass eine bestimmte Entity Aktion mit regulärer while loop gelegentlich (!) nicht durch level_load() beendet wird, als sei PROC_GLOBAL gesetzt oder der me pointer verändert worden/ auf NULL gesetzt (zumindest glaube ich, dass das das entsprechende Verhalten ist).
Die Struktur ist so ziemlich die folgende:

Code:
var enemyFreeze = 0;
#define EFWAIT while(enemyFreeze) wait(1)

action robot()
{
	//proc_mode = PROC_GLOBAL;
	my.skill1 = 64;
	while(my.skill1 > 0)
	{
		EFWAIT;
		sys_marker("ME1");
		diag_var("\n enemy death loop at frame %.0f",total_frames);
		diag_var(" with pointer %.5f",me); // just to differentiate different enemies
		my.pan += 5*time_step;
		sys_marker(NULL);
		my.skill1 -= time_step;
		wait(1);
	}
	ptr_remove(me);
}

void main()
{
	fps_max = 60;
	level_load(NULL);
	ent_create(CUBE_MDL,vector(100,0,0),robot);
	while(!key_space) wait(1);
	enemyFreeze = 1;
	wait(1);
	diag_var("\n ##### loading new level at frame %.0f",total_frames);
	level_load(NULL);
	enemyFreeze = 0;
}


Mir ist klar, dass diese Code Struktur nicht allzu gut ist mit der internen define Loop, aber bis zur Vollendung dieses jahrealten Projektes wollte ich sie beibehalten.
So oder so sollte es aber eigentlich keinen Absturz durch Zugriff auf den my pointer in der robot loop geben. Der Pointer wird zwar durch level_load korrekt auf 0 gesetzt wird, aber da die Aktion selbst nicht beendet wird, kommt es unweigerlich zum Crash.
Das vorherige Code Beispiel stürzt nicht ab, der entsprechende Code in meinem Projekt aber sehr wohl, wenn auch nur gelegentlich. acklog spuckt dann folgendes aus:
Quote:
enemy death loop at frame 6514 with pointer 303994.56250
enemy death loop at frame 6515 with pointer 303994.56250
##### loading new level map39.wmb at frame 6634
LevelInit at 130.194
20 entities 0 cameras 0 lights 0 sounds 0 paths
1 lmaps 2 textures 3 meshes 3 submeshes 36 faces...ok
LevelReady at 130.264
enemy death loop at frame 6639 with pointer 0.00000
Error E1513: Script crash in enemy_mobile2: ME1
Normal exit at 134.342


Was könnte dieses Verhalten in meinem Projekt verursachen (welches übrigens nur bei dynamisch erstellten Entitys aufzutreten scheint)? Ich rufe in der robot-Aktion keine Subroutine auf, welche direkt PROC_GLOBAL setzt. Stattdessen scheint es eine andere externe Ursache haben zu müssen, aber ich weiß nicht wirklich, wo ich suchen kann oder muss.
Posted By: Superku

[solved] STR Fehlermeldung und acklog Frage - 12/11/15 16:30

Ich habe die Fehlerursache ausfindig machen können:
In der Loop für die Todesanimation dieser besonderen Gegner, welche nach Abschuss in die Tiefe fallen, habe ich diese unachtsam weit außerhalb der Levelgrenzen fallen lassen. Offenbar verträgt das entweder der ABT, level_load() oder aber wahrscheinlicher eine Kombination aller 3 Dinge (inklusive meines schlechten Codes) nicht und die Entity/ alle außerhalb der Levelgrenzen werden nicht entfernt.
Posted By: FBL

Re: [solved] STR Fehlermeldung und acklog Frage - 12/12/15 09:17

Alternativ hättest du auch noch probieren können, das EFWAIT ans Ende der Schleife zu schieben. Falls das nicht hilft (oder die Logik plättet), dann danach den my-Pointer nochmal explizit überprüfen und ggf. Exitus.
Und wenn das nicht hilft, vor dem Rücksetzen von enemy_freeze ein wait(1) rein. Dann muss die Entity Funktion auf jeden Fall nochmal durch ein wait() durch direkt nach dem Levelwechsel, und muss eigentlich beendet werden. Anders könnte rein theoretisch ja noch der Rest der Funktion ausgeführt werden, und dann knallts natürlich (auch wenn ich eigentlich erwarten würde, dass die Entity Funktionen vor Start des Levels abgebrochen werden).
Posted By: Superku

Re: [solved] STR Fehlermeldung und acklog Frage - 12/13/15 10:09

Ja natürlich, ich hätte viele kleine Dinge implementieren oder ändern können, um den Crash zu verhindern.
Das wollte ich ja aber auf keinen Fall, stattdessen wollte ich, dass es auch weiterhin crasht und ich so die Fehlerursache ausfindig machen kann, nämlich warum die Aktion nicht beendet wird. Es liegt und lag ja nicht an der Code Struktur (gemäß des Beispiels) selbst, sondern daran, dass die Entity beim level_load sich nicht mehr in den Level Dimensionen befand.
Posted By: FBL

Re: [solved] STR Fehlermeldung und acklog Frage - 12/13/15 14:20

Wenn dem wirklich so sein sollte, dann klingt das aber schon sehr nach Engine Bug. Gewollt kann das eigentlich nicht sein.

Ansonsten ist es ja oft so, dass man bei den fiesen Bugs irgendwo ne Zahl oder irgendwas am Code ändert, und plötzlich ist das Problem weg, bei der nächsten Änderung taucht es wieder auf.
Posted By: jcl

Re: [solved] STR Fehlermeldung und acklog Frage - 12/14/15 10:38

Killen eines Gegners außerhalb der Levelgrenzen produziert zwar einen ABT Fehler, sollte aber weiter keine Konseqenzen haben. Ich kann auch im ABT Code nichts Verdächtiges sehen.

Können Sie das Projekt in der Crash-Version hochladen oder an den Support senden? Das wollen wir uns mal ansehen.
Posted By: Superku

Re: [solved] STR Fehlermeldung und acklog Frage - 12/15/15 10:14

Hm da war ich wohl etwas voreilig.
Nachdem ich nun etwas am Level und Code änderte und danach den endlosen Fall wieder aktivierte, war der Crash nicht mehr herbeizuführen bzw. nur noch ganz selten. Es liegt wohl doch etwas im Argen mit dem restlichen Code und/ oder den Dateien.
Nun crasht es wieder halbwegs regelmäßig, aber auch nicht bei jedem Spielstart und erst nach dem 2. Laden eines Levels... oh oh. Ich schicke das Projekt heute Abend in abgespeckter Form an den Support, ich danke schon einmal im Voraus!
Posted By: Superku

Re: [solved] STR Fehlermeldung und acklog Frage - 12/15/15 10:57

Ich habe das einigermaßen vollständige Projekt samt Anleitung an den Support geschickt. Vielen Dank!
Posted By: Superku

Re: [solved] STR Fehlermeldung und acklog Frage - 06/06/16 17:45

Originally Posted By: Superku
(2) Zudem tauchten in dieser acklog-Datei, welche in etwa 8 Levelladevorgänge aufweist, zum ersten Mal drei mir vorher unbekannte "Statusberichte" auf der folgenden Form:

Quote:
Status at time 283.632 frame 33364 ---------
init_gamepad [...]
Maximum Time: MINE2.MDL:mine_proxy => 1.861572


Originally Posted By: jcl
Die Statusberichte sind mir auch unbekannt - könnten das eine Testroutine von Ihnen sein?


Ich wunderte mich soeben wieder über diesen Statusbericht und kam nach etwas Suchen und Raten auf die Ursache:

Code:
void def_debug() 
{
	beep();
	if(key_alt) 
	{ 
		diag_status(); 
		return; 
	}
	
	if(key_shift) 
	{
		diag_status();
		[...]
	}
	[...]
}


Originally Posted By: Manual
diag_status()
Schreibt den gegenwärtigen Status aller laufenden Funktionen ein es Projekts in die acklog.txt-Datei. In default.c ist diese Funktion der Tastenkombination [Alt-F11] zugewiesen.
© 2024 lite-C Forums