Klassen Variable verliert Inhalt

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Klassen Variable verliert Inhalt

Beitrag von ramses »

Guten Morgen

ich jage zur Zeit einen merkwürdigen Fehler.

Während längerer Berechnungen in denen das Xbase Programm den zugehörigen CPU Kern voll auslastet kommt es ab und zu
dazu dass eine Klassenvariable plötzlich nicht mehr das zugewiesene Objekt enthält sondern nur noch den Wert NIL
Was dann dann die Berechnung beendet.

Weiss jemand was das sein könnte?
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Klassen Variable verliert Inhalt

Beitrag von Tom »

Objekte sind in anderen Variablen immer nur als Referenzen verfügbar. Wenn anderswo das Objekt manipuliert - z.B. auch geNILt - wird, ist es auch aus der Objektvariablen verschwunden.
Herzlich,
Tom
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Hallo Tom

genau das ist das Problem, die Variable wird eigentlich nirgendwo geNILt. Aber ich führe nochmals einen neuen Code-Review durch ....
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Momentan scheint es so dass mit gezielt eingebauten Pausen das Problem nicht auftritt wenn die Pausen so gewählt werden dass der verwendete CPU-Kern nicht über ca. 80% belastet wird.
Merkwürdig!
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Gelöst.
Ganz ohne Anpassungen am eigentlichen Code oder an den Funktionen.
Die Lösung hinterlässt jedoch grosse Fragen und arge Zweifel ......
Valar Morghulis

Gruss Carlo
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Klassen Variable verliert Inhalt

Beitrag von Tom »

Prozesspriorität? Virenscannerausnahme? Was war die Lösung?
Herzlich,
Tom
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Nachtrag:

das wars leider auch nicht.

Das was bis jetzt hilft sind Pausen einzubauen.

Ich verstehe es nicht!!
Valar Morghulis

Gruss Carlo
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Klassen Variable verliert Inhalt

Beitrag von Frank Grossheinrich »

Tach Ramses,
... weil es sich so ungewöhnlich anhört ...
Code-Review abgeschlossen? Wirklich nicht/nirgends geNILt?
Leitest du von der Klasse (deren Klassenvariable sich seltsam verhält) ab?
Gibt es/verwendst du Casts zu dieser Klassenvariablen?
Was für ein Objekt steckt in der Klassenvariablen? Hat sich dieses Objekt pulverisiert?
Das sind so Fragen, die mir in den Kopf kommen.
Denn, was du beschreibst - gebe ich gerne zu - kann und darf nicht sein.
Gruß
Frank
We love Xbase++, and you?
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Hallo Frank

Danke der Nachfrage.
Ja. Der Code - Review habe ich ohne Resultate abeschlossen.
In dem Objekt das ab und zu genilt erscheint ist der Vater aller Töchterobjekte.
Es gibt keine Casts und es sind alles in Xbase geschriebene Klassen.

Meist lassen sich Total-Crash's durch testen der Variable ::oParent auf Objekt abfangen, selten jedoch nicht und obwohl auch
auf isMemberVar() getestet gibts doch einen Totalcrash. Siehe Beispiel.

Code: Alles auswählen

if valtype(::oParent) = "O"
       if IsMemberVar( ::oParent, "cFileName" ) .and. IsMemberVar( self, "cFileName" )

          ::cFileName := ::oParent:cFileName  

        //      Fehlermeldung über Errorblock  -> tritt selten auf
	//	ERROR BASE/2266
        //      Empfänger der Nachrichten ist kein Objekt: cFileName 
       endif 

else
        // Fehlermeldung an User und ProgrammEnde --> tritt öfters  auf 
           
endif 

Wenn ich die CPU-Belastung des Kerns der für das verwendete Programms verwendet wird mit Pausen sleep() auf ca. 80% halte tritt das Problem auch bei tagelangem Rechnen nicht auf. Ohne diese Sleeps kann es Minuten bis mehrere Stunden bis zum Crash dauern ......

Aus purer Ratlosigkeit habe ich seit langer Zeit auch noch die alte 1.9.355 Version ausgegraben. Aber auch damit besteht das Problem
Valar Morghulis

Gruss Carlo
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Klassen Variable verliert Inhalt

Beitrag von Frank Grossheinrich »

Hallo Carlo,
weitere Fragen ...
- ist das "alter" Code, der seit Jahren läuft und plötzlich das Absturzverhalten zeigt oder neuer Code?
- Multi-Threading im Spiel (was ich vermute)?
- kann ich mal ein xpperror.log sehen? An welcher Stelle knallt es?
- ich gehe davaon aus, dass :oParent diese von dir angesprochene Klassenvariable ist!?
- wann und wie oft wird :oParent geschrieben? Also der Inhalt verändert?
- wie ist :Parent deklariert?
- sind die Methoden, in der der Fehler passiert/in der die Klassenvariable beschrieben wird besonders geschützt? Attribute?

Das Folgende sind nur Mutmaßungen von mir, ... wenn die Klassenvariable in verschiedenen Threads verwendet wird und alle lustig darauf rumhämmern, das aber nicht abgesichert ist, dann könnte ich mir so ein Verhalten vorstellen. Denn z.B. dein Code ist ja keine abgeschottete Transaktion. Du prüfst zwar, ob ::oParent ein Objekt ist, aber eine Schrecksekunde später kann es das schon nicht mehr sein. Soll heißen, dass zwischen Zeile 1 und 4 deines Code viel passieren kann in einem anderen Thread??? So könnte ich mir auch erklären, dass Sleeps das Verhalten ändert. Denn damit wird die Wahrscheinlichkeit, dass irgend etwas zwischen deine Zeile 1 und 4 "reinhüpft" geringer, mit Glück nichtig.

In aller Regel sind solche nicht-deterministischen Probleme Timing Probleme.

Ich möchte eigentlich auf das SYNC Attribut von Methoden hinaus ... kann es so etwas sein? Bzw. helfen?

Konnte ich mich ein bisschen erklären?

Grüße
Frank
We love Xbase++, and you?
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Hallo Frank

- es ist gewachsener Code.
Auf das Absturzverhalten wurde bis jetzt einfach nicht getestet.
Neuerdings gehört vor dem Rollout auch ein Pen-Test zur Qualitätsprüfung dazu den der Code nun nicht mehr besteht.
- Ja es ist ein Multi-Threading Programm.
- Der Fehler tritt mit Verweis auf die Zeile ::cFileName := ::oParent:cFileName auf geloggt wird neben dem Callstack nur
ERROR BASE/2266
Empfänger der Nachrichten ist kein Objekt: cFileName
- in ::oParent wird nur in SYNC Methoden der Vaterklasse geschrieben. Alle Töchter lesen diese nur noch. (rechte seite von := )
aber die Töchter können durchwegs noch unterwegs sein wenn im Vater Thread ::oParent geändert wird....

ohjeeee, ohjeeeee könnte dies die Ursache sein????? Das ändern von ::oParent im Vater Thread ändert diesen gleichzeitig auch in allen
Variablen der Töchter die diesen zugewiesen bekommen haben?

- in ::oParent wird über die Sync Methode sehr viel geschrieben
- ::oParent ist als EXPORTED: VAR deklariert
- Die Methode die ::oParent liest ist nicht geschützt.


Auf das Objekt und die Member prüfe ich erst seit ich wegen der Qualitätsprüfung auf der "Problemsuche" bin.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von Werner_Bayern »

Ihr redet hier aber schon von immer von ein und demselben Object, welches dann in versch. Threads benutzt wird? Nicht sowas:

Code: Alles auswählen

thread1:
local oStatic := xbpStatic():new()…
oStatic:cargo := "blabla"

thread2:
local oStatic := xbpStatic():new()…
oStatic:cargo := "hallo"
Das ist komplett gekapselt.

Ihr redet von sowas:

Code: Alles auswählen

local oStatic := xbpStatic():new(), oThread1 := Thread():new(, "Thread1"), oThread2 := Thread():new(, "Thread2")
oStatic:cargo := "blabla"

oThread1:start("functionirgendwas", oStatic)
oThread2:start("functionirgendwas", oStatic)
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von ramses »

Hallo Frank

nach einigen Anpassungen bewältigt der Code nun auch die hohen Anforderungen des Pen-Tests.
Es war wie du vermutet hast. Das lesen der Objekt Variable erfolgt jetzt auch nur noch über eine Sync Methode der Parentklasse
und das Problem ist beseitigt.
DANKE für den Tip.

Hallo Werner

Ja es ist ein Objekte auf dass aus mehreren Threads zugegriffen wird.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Frank Grossheinrich
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 142
Registriert: Fr, 31. Mär 2017 15:06
Wohnort: Eschborn
Hat sich bedankt: 5 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: Klassen Variable verliert Inhalt

Beitrag von Frank Grossheinrich »

Hallo Carlo,
Danke für die Rückmeldung.
Ich hoffe, dass sich am Status nichts mehr geändert hat und der Code immer noch sicher läuft ...

Du verwendest die Klassenvariable wie eine Art PUBLIC (wenn ich das richtig verstanden habe).
Und ja, man sollte das Schreiben .AND. das Lesen "schützen".
Das erste Beispiel bei SYNC sagt es eigentlich:

// A class for managing a queue is programmed in this example.
// The queue is realized using an array that can be accessed
// from multiple threads via the methods :put() and :get().
// Four threads are started in the Main() procedure which are
// accessing the queue. If either method :put() or :get() is
// declared without the SYNC attribute, a runtime error will
// occur sooner or later because the Queue object will fall
// into an inconsistent state.


Nun denn, Gefahr erkannt, Gefahr gebannt.
Das, was du beschrieben hattest, hatte mich einfach stutzig gemacht. Solche elementaren Fehler gibt es in Xbase++ einfach nicht mehr. Dann würden zu viele sehr komplexe Anwendungen nicht mehr laufen.

Gruß
Frank
We love Xbase++, and you?
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: Klassen Variable verliert Inhalt

Beitrag von Werner_Bayern »

Servus Frank,

besagtes Beispiel ist leider nicht sehr zielführend. Erstens läuft es auch ohne sync-Methoden ohne Fehler durch und 2. ist es m. M. n. nicht logisch aufgebaut:
Da werden 4 Thread gestartet, die per :get() Werte aus der Queue holen. Soweit so gut. Aber beim Start der 4 Threads sind noch keine Werte in der Queue und das

Code: Alles auswählen

IF ::nCount > 0
sorgt dafür, dass es zu keinem Runtime-Fehler kommt.
Damit erscheint erstmal NIL am Bildschirm.
Erst danach wird eine Schleife mit 40000 Durchgängen gestartet, die die Queue befüllt. Vermutlich stehen in dieser Zeit sogar die 4 Threads? Erst danach läuft das Runterzählen geregelt ab. Es liefert aber trotz sync-Methoden jedesmal ein anderes Ergebnis und landet nicht - wie vermutlich ursprünglich gewollt - sauber bei 0.

Was ihr damit zeigen möchtet, dürfte klar sein, aber das Beispiel tuts nicht richtig.

Ist nicht böse gemeint, nur wenn andere sich aufgrund dieses Threads das Beispiel anschauen - wie ich jetzt zum 1. Male - sich nicht wundern.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten