Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
ij1972
Rookie
Rookie
Beiträge: 13
Registriert: Di, 11. Sep 2012 14:08

Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ij1972 » Di, 12. Nov 2019 18:08

Hallo zusammen,
ich ermittel von einem Objekt die Member-Variablen über :classdescribe(CLASS_DESCR_MEMBERS,CLASS_HIDDEN).
Bekomme dadurch auch die Protected-Members.

Ich weiß, dass man Protected-Variablen von außen nicht aufrufen kann, aber ich suche trotzdem nach einer Lösung.
Jemand (georg) schrieb mal in einem anderen Thread "Du kannst in einer Funktion ein Objekt anschauen und dort selbst iVars ansehen, die PROTECTED sind".

Verstehe aber nicht wie er das meint oder das gehen soll!
Kann mir jemand da weiterhelfen?
Gruß

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2469
Registriert: Fr, 08. Feb 2008 21:29

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von georg » Di, 12. Nov 2019 20:36

Hallo, ij1972 -


das geht erst einmal nicht.

Was genau willst Du denn machen? Wenn Du selbst Zugriff auf die Klassendefinition hast (also: Quellcode), dann kannst Du doch Methoden definieren, mit denen der Zugriff möglich wird.

Wenn Du mit Fremdklassen arbeitest (bei denen Du keinen Zugriff auf den Quellcode hast), dann gibt es möglicherweise gute Gründe, warum der Hersteller diese iVars auf PROTECTED gesetzt hat.

Du kannst das Programm natürlich im Debugger laufen lassen und dort das Objekt untersuchen. Dort siehst Du auch die Werte, die in PROTECTED iVars drinstehen. Aber eben nur mittels des Debuggers.

Aber vielleicht erklärst Du Dein Problem etwas ausführlicher?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14880
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von brandelh » Mi, 13. Nov 2019 8:13

wenn man den Quellcode der genauen Classe nicht hat, kann man dennoch eine abgeleitete Klasse generieren.
Innerhalb dieser Klasse sind auch protect Vars der Basisklasse sichtbar und zugreifbar, solange genau das nicht in der Basisklasse verhindert wurde ... es gibt da ein paar Befehle die ich noch nie genutzt habe ;-)
Gruß
Hubert

ij1972
Rookie
Rookie
Beiträge: 13
Registriert: Di, 11. Sep 2012 14:08

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ij1972 » Mi, 13. Nov 2019 9:07

Es geht um folgendes:
Unser Programm hat irgendwo ein Speicherleck. Wird im Laufe des Lebenszykluses immer langsamer.
Haben verschiedenste Protokolle geschrieben, die uns Daten liefern über Prozessspeicher, Memoryhandles, Active Queries, offene Dateien, Threads usw.
Alle Werte die wir ermittelt haben, waren Ok. Auch über den MemoryWatch sieht man keine Auffälligkeiten.
Nachdem alle Werte zum Zeitpunkts der Performanceproblematik soweit im Rahmen liegen, vermuten wir, dass vlt. irgendein Array eines Objekts hochgeschauckelt wird.
Daher dachte ich, dass ich eine Routine schreibe, die in dieser Situation rekursiv durch alle Members durchgeht und z.B. Arrays auf Größe analysiert und protokolliert.
Um das aber zu bewerkstelligen muss ich auch Protected Members evaluieren können.

Gruß

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7793
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von Tom » Mi, 13. Nov 2019 10:04

Du könntest alle Klassen mit einer zusätzlichen Methode ausstatten, die die Inhalte aller Protected-Variablen liefert. Das ginge relativ leicht über eine zusätzliche Klasse, die nur diese Methode enthält und als zusätzliche Superklasse aller anderen Klassen etabliert wird. Ist ein bisschen Tipparbeit.

Ansonsten: Hast Du die Alaska-Knowledgebase schonmal nach dem Stichwort "Memory" durchsucht?
Herzlich,
Tom

ij1972
Rookie
Rookie
Beiträge: 13
Registriert: Di, 11. Sep 2012 14:08

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ij1972 » Mi, 13. Nov 2019 10:38

Hallo Tom,
wir lassen die meisten Klassen von so einer Minimal-Klasse erben und haben darin eine Methode implementiert, die mir die Protected anzeigen lassen kann. Funktioniert auch gut.
Wollte mir aber nicht die Arbeit machen, alle unsere Klassen jetzt anzufassen und hoffte es gäbe eine einfachere Möglichkeit :D

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12168
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von AUGE_OHR » Mi, 13. Nov 2019 10:43

hi,

von welcher CLASS reden wir :?:
ist das eine Xbase++ CLASS :?:

es gibt eine Sache die meisten hilft : SLEEP(1)
es geht einfach darum dem CG Zeit zu geben "aufzuräumen" denn sonst wird "alles mögliche" hoch schaukelt.

---

hier ein Test Code für das Problem

Code: Alles auswählen

#include "Class.ch"

PROCEDURE MAIN
LOCAL oTest := MyTest():New()
LOCAL aInfo
LOCAL bSaveError,oError

   aInfo := oTest:classdescribe(CLASS_DESCR_MEMBERS,CLASS_HIDDEN)

   ? VAR2CHAR(aInfo)
   ? "-----------------------------------------------------------"
   ? VAR2CHAR( oTest:ShowAll() )
   ? "-----------------------------------------------------------"
   ? ""
   ? oTest:cSICHTBAR
   ? ""
   WAIT "jetzt kommt der crash"
   ? ""
   bSaveError := ErrorBlock()

   ErrorBlock( {|e| Break(e)} )
   BEGIN SEQUENCE
      ? otest:cVERSTECKT
   RECOVER USING oError
      ErrorBlock( bSaveError )
      Msgbox(oError:description,"cVERSTECKT")
   END
   ErrorBlock( bSaveError )

   ErrorBlock( {|e| Break(e)} )
   BEGIN SEQUENCE
      ? otest:cGEHEIM
   RECOVER USING oError
      ErrorBlock( bSaveError )
      Msgbox(oError:description,"cGEHEIM")
   END
   ErrorBlock( bSaveError )

RETURN


CLASS MyTest
PROTECTED:
   VAR cGEHEIM
HIDDEN:
   VAR cVERSTECKT
EXPORTED:
   VAR cSICHTBAR

INLINE METHOD INIT()
   ::cGEHEIM    := "sieht man nicht"
   ::cVERSTECKT := "versteckt"
   ::cSICHTBAR  := "Hello world"
RETURN NIL

INLINE METHOD ShowAll()
RETURN ({ ::cGEHEIM, ::cVERSTECKT, ::cSICHTBAR })

ENDCLASS

*
*eof
*
beim Zugriff auf Type HIDDEN: oder PROTECTED: bekommt man
oError:description : Zugriff auf Member-Variable nicht erlaubt
oError:genCode : 28
oError:osCode : 0
oError:subCode : 2244
gruss by OHR
Jimmy

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14880
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von brandelh » Mi, 13. Nov 2019 14:32

Die normalen Speicher Variablen werden durch den GC davon befreit so überwacht zu werden, der kümmert sich alleine drum.

Nur externer Speicher (Aufrufe fremder DLLs, Verweise auf Fonts etc. ) ist grundsätzlich ein Problem.
Als ich die HBPrintPDF Klasse geschrieben habe, hatte ich zunächst die QuickPDF immer mit dllunload() entfernt, und neu geladen.
Das führte zu einem steten RAM Wachstum. Dllunload() raus (die wird von Windows nach meinem Programmende geschlossen) und alles war gut.
Einmal hatte Pablo einen Fehler bei sich und nach meinem Hinweis ist der wieder weg.

Ich erzeuge stundenlang PDFs im Millionen Bereich, der Speicherbedarf läuft leicht hoch und dann wieder runter (PDF im Programm geschlossen).

Mit Pablos Funktionen KANN man permanenten Speicher reservieren, nutzen ... und muss den dann auch wieder freigeben.

Wie Jimmy schrieb, braucht der GC aber auch etwas Zeit und manchmal etwas Hilfe.
Wenn einer Variablen viel Speicher zugeordnet war hilft ein xVar := NIL um dem GC sofort den Hinweis zu geben, räum mal auf.
Dafür braucht er Zeit, wenn also eine lange Schleife läuft (sollte man ja eigenlich nicht), hilft ein sleep(0) auch mal dem Rest etwas Zeit zu gönnen.
Gruß
Hubert

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1512
Registriert: Mi, 28. Jul 2010 17:16

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ramses » Mi, 13. Nov 2019 15:57

Ich würde mal prozessexplorer (z.b. von sysinternals) verwenden und beobachten ob es da auffälligkeiten gibt z.B. die anzahl der Handles ständig steigt usw.
Valar Morghulis

Gruss Carlo

ij1972
Rookie
Rookie
Beiträge: 13
Registriert: Di, 11. Sep 2012 14:08

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ij1972 » Do, 14. Nov 2019 12:22

Hallo miteinander,
Es ist leider nicht an einer Klasse oder best. Szenario fest zu machen. Wir kriegen nur mitgeteilt von den Kunden, dass es langsamer wird.
Alle Protokolle um dem Problem näher zu kommen waren nicht aufschlußreich, z.B. wie schon gesagt Auswertungen von Memory-Handles, Handles, GDI etc.

Wie gesagt, vermute ich, dass unter Umständen irgendein Array in den unweiten des Programms vlt. hochgeschauckelt wird und bei jedem Zugriff darauf sich das Programm verlangsamt, weil es immer größer wird und mehr gemacht werden muss.

Bei sehr großen Arrays müsste sich das auch in den Memory-Handles wiederspiegeln, was es nicht tut. Jedoch kann auch ein paar Hundert Einträge großes Array, das mit irgendwelchen Objekten gefüllt ist zu solchen Performance-Problemen führen, sofern die Objekte groß sind und mit den etwas durchgeführt wird.

Daher der Versuch rekursiv mit classdescribe den Stellen näherzukommen.

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1512
Registriert: Mi, 28. Jul 2010 17:16

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ramses » Do, 14. Nov 2019 22:01

Hast du auch mal daran gedacht dass "es wird immer langsamer" auch eine andere Ursache haben könnte die nicht bei deinem Programm liegt sondern Ressourcen auf den PC auch anderweitig belegt sein könnten?
Valar Morghulis

Gruss Carlo

ij1972
Rookie
Rookie
Beiträge: 13
Registriert: Di, 11. Sep 2012 14:08

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ij1972 » Fr, 15. Nov 2019 16:04

Ja, wir haben auch daran gedacht, dass es vlt. nicht direkt an unserem Programm liegt.
Was jedoch dafür spricht, ist, dass die Kunden mit dem Performanceproblemen auf eine neue Version unseres Programms umgestiegen sind.
Mit der Vorgängerversion gabs Performancetechnisch keine Probleme.
Komischerweise ist es so, dass selbst beim gleichen Kunden, die Performanceproblem bei einigen Rechner/User nicht stattfinden und bei anderen doch.

Wir haben daher auch schon Analysen gemacht zu den eingesetzten Windowsversersionen/-builds und ADS-Versionen etc.
Leider kein Muster zu erkennen.
Daher gehen wir bisher noch davon aus, dass es an unserem Programm liegen muss.

Das "gute" an dieser Geschichte ist, dass wir im Zuge der Analysen andere Problemchen/Bugs finden und lösen konnten.
Leider aber das Hauptproblem noch nicht :(

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2469
Registriert: Fr, 08. Feb 2008 21:29

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von georg » Fr, 15. Nov 2019 19:12

Hallo,


in dem Fall würde ich mich einem der betroffenen Kunden reden und auf ein oder zwei Rechner, auf denen die Probleme auftreten, eine abgewandelte Version installieren, die mit memwatch gelinkt ist. Da der Kunde wahrscheinlich auch ein Interesse daran hat, dass das Problem behoben wird, kann ich mir denken, dass man ein zusätzliches Fenster in Kauf nimmt. Vielleicht findest Du ja auf diesem Wege etwas heraus.

Arbeiten die Programme mit Threads?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12168
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von AUGE_OHR » Sa, 16. Nov 2019 8:32

hi,
ij1972 hat geschrieben:
Fr, 15. Nov 2019 16:04
Komischerweise ist es so, dass selbst beim gleichen Kunden, die Performanceproblem bei einigen Rechner/User nicht stattfinden und bei anderen doch.
dann lege mal einen neuen User auf den Problem PC an und versuche es damit.
ich habe auf meinen PC einen User "B" wo das Windows so "zerstört" ist das da komische Sachen passieren.
gruss by OHR
Jimmy

ij1972
Rookie
Rookie
Beiträge: 13
Registriert: Di, 11. Sep 2012 14:08

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ij1972 » Sa, 16. Nov 2019 22:15

Haben das schon durchgeführt, mit Auswahl bestimmter User und Analyse mit Memwatch etc.
Keine positiven Ergebnisse.
Ja, Arbeiten mit Threads.

Ein interessanter Gedanke mit dem Anlegen eines neuen Users. Jedoch, warum kommen erst nach Update auf die neue Version plötzlich diese Performance Probleme?

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1512
Registriert: Mi, 28. Jul 2010 17:16

Re: Wert von Protected Variablen irgendwie anzeigen außerhalb der Klasse?

Beitrag von ramses » So, 24. Nov 2019 18:52

Könnte es am neuen Viren und Bedohungsschutz / Exploit-Schutz von Windows liegen?
Damit habe ich schon gekämpft......
Valar Morghulis

Gruss Carlo

Antworten