Seite 1 von 1

Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 9:19
von Dominik Krebs
Guten Morgen,
wir kämpfen seid einiger Zeit an einer Baustelle.
Wir haben eine "Server-Anwendung" auf der mit Main-Thread 10 Threads laufen.
Einige Threads lesen Xml Dateien ein und verarbeiten diese, andere geben verschiedene Daten, zB Json aus.

Nun stehen wir vor dem Problem das wir immer wiederdDiverse Fehler bekommen. Bei einigen dieser Fehler bleiben alle Threads stehen, bei anderen nur der Betroffene. Anfangs dachten wir das dies alles verschiedene Fehler sind, jedoch glauben wir nun das alle nun die selbe Ursache haben, die wir aber einfach nicht finden können. Uns fehlt es einfach an Erfahrung. Wir vermuten das hier ein Speicher vollläuft?

Anbei habe ich einige dieser Fehler in einer PDF angehängt
Fehler.pdf
(97.61 KiB) 297-mal heruntergeladen
Vielleicht hat jemand eine Idee und erbarmt sich unserer ...

Liebe Grüße aus Hanau!

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 9:36
von Jan
Moin Dominik,

womit lest Ihr denn die XML ein? Wandelt Ihr die in DataObjects? Oder per XmlSimpleParser? Ich arbeite viel mit letzterem. Und habe die Erfahrung gemacht das man nicht genug abfragen kann ob die einzelnen Nodes wirklich existieren. Das mache ich meist mit :getChild().

Bei DataObjects gibt es unter bestimmten Bedingungen einen Speicherfehler, siehe PDR 7280. Allerdings sehe ich bei Dir keine Fehlermeldungen, die auf einen Speicherproblem hinweisen. Ich bekomme dann regelmäßig einen Laufzeitfehler mit der Meldung "Nicht genügend Speicher".

Das allerdings manchmal alle Threads stehen bleiben finde ich aber schon irritierend. Könnte auf die von Dir erwähnten Speicherprobleme hinweisen.

Jan

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 9:59
von Dominik Krebs
Hallo Jan,
vielen Dank erstmal für deine Antwort.

Wir lesen die XML Dateien via beforAtNum und AfterAtNum ein.
zB:

Code: Alles auswählen

IIF(NumAt("<Anrufer>",cDaten) > 0, oADAuftrag_App:aanrufer:asString := AfterAtNum("<Anrufer>",BeforAtNum("</Anrufer>",cDaten,1),1), )
Den Laufzeitfehler "Nicht genügend Speicher" haben wir so noch gar nicht erhalten.

Alle Threads bleiben auch nur stehen wenn der Fehler auf der PDF Seite 5 geworfen wird.
Es ist wie als wäre die Datenbank abgehängt. Aber dies ist wohl nicht der Fall, auch in der ads_err kann ich keine Fehler finden...

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 10:21
von Jan
Hallo Dominik,

aber was sind das dann für nicht existierende Methoden? Stammen die aus Euren eigenen Klassen? Ich hatte jetzt erwartet das die aus der eingelesenen XML stammen.

Jan

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 10:26
von Dominik Krebs
Oh ich dachte bis eben das wären Boardmittel von Xbase.
Dann wurde sie möglicherweise von Friedhelm Göder aus Clipper übernommen.

Hast du dir denn alle Fehler mal angeschaut?

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 10:42
von Tom
Es soll in "Appauftragportaabschlussprf" und dort in Zeile 4436 auf die iVar "tbuploaderfolg" zugegriffen werden, aber das Objekt, an dem sie vermeintlich hängt (die Zeile lautet wahrscheinlich "IF oObject:tbuploaderfolg" oder so), kennt diese iVar überhaupt nicht. Wie lautet der Code in dieser Zeile? Ist das fragliche Objekt möglicherweise PUBLIC und wird in mehreren Threads manipuliert?

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 10:42
von Jan
Keine der aufgerufenen Funktionen oder Methoden sagt mir irgend was.

Jan

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 10:47
von Dominik Krebs
Hallo Tom,

Die Zeile wäre wie folgt:

Code: Alles auswählen

IF oADAuftrag:tbuploaderfolg:asString = "1"
oADAuftrag2:r_id:asString := PortaRechnungGenerierenFunk(oADAuftrag,oADAuftrag2,oSoapClient,oServVar)
IIF( len(oADAuftrag2:r_id:asString) > 0,oADAuftrag2:portaabschluss:asString := "1" , )
ENDIF
tbuploaderfolg ist ein Datenbankfeld in einer ADT Tabelle, oADAuftrag ist demnach eine geöffnete Datenbank.

Die Variable ist nicht Public, Sie wird Local deklariert und nach durchlauf auf NIL gesetzt.

@Jan,
Es wurden damals viele Funktionen aus Clipper übernommen mir war nicht bewusst das dies eine davon ist.
Ich schreibe Xbase erst seit ca 2-3Jahren.

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 13:09
von Dominik Krebs
Die Angeblichen Klassen die in der Fehlermeldung auftauche, sind mir auch unbekannt.

Hat denn niemand eine Idee wo wir ansetzen könnten? :?

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 14:18
von Marcus Herz
Kann es sein, dass die Fehlermeldungen sich auf eine ADS Klasse, welche eine Tabelle repräsentiert, schon geschlossen ist, aber noch ein Zugriff erfolgt?
Die letzte Meldung kommt ja von einer Klasse AceTable. Wenn Friedhelm das mal umgesetzt hat, hat er bestimmt solche Tabellenobjekte erzeugt.
Das Tabellenobjekt scheint nicht mehr korrekt zu sein, wie auch immer. Ich habe schon erlebt, dass sich Code "überholt", vor allem in Threads. Da wird noch was weggeschrieben, obwohl schon ein Destroy oder sowas erfolgt ist. Werden die Threads geschlossen? Jeder Thread hat ja eine eigene Connection, wie wird die verwaltet? Irgendwo da muss das Problem entstehen, aber ohne Code tapp auch ich im Dunkeln

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 14:26
von Dominik Krebs
Ja es bezieht sich auf eine ADS Klasse. Geschlossen ist diese nicht, aber das mit dem "überholt" hört sich interessant an. Von der Theorie passt das auch zum Fehlerbild.

Jeder Thread hat seine eigene Connection die in der :atStart Methode connected und in der atEnd Mehtode getrennt wird.
Die Connections sind auch dauerhaft verbunden, werden also beim starten verbunden und beim beenden der Applikation getrennt.

Ich stelle gerne Quelltext zur Verfügung. Es gestaltet sich nur schwierig, da der Fehler immermal wo anders auftaucht und sich so keine genaue stelle ausmachen lässt. Ich weiß nur umso enger die Taktung des Threads desto wahrscheinlicher treten Fehler auf.

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Di, 26. Mai 2020 14:39
von Manfred
die Funktionen stammen aus dem TOOLS 3, die serienmäßig mittlerweile dabei sind.

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Mi, 10. Feb 2021 8:39
von Dominik Krebs
Guten Morgen zusammen,
mittlerweise haben wir das besagte Programm in einen Dienst gewandet und haben jede Codezeile überarbeitet.
Wie bereits bekant laufen mehrere Threads und durch den Umzug konnten wir den Übeltäter Thread ausfindig machen.
Den Speicherfehler haben wir übrings mit übernommen und suchen noch nach wie vor woher er kommt...

Meine Frage:
Wie komme ich einem Speicherfehler bei einem Dienst am besten auf die Spur. Gibt es aktuell bekannte Klassen die vielleicht irgendwelche Handels nicht mehr frei geben ?

Wir kämpfen mit diesem Problem nun schon seit mehr als einem Jahr ...

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Mi, 10. Feb 2021 8:53
von Jan
Dominik,

es gab da tatsächlich diverse Funktionen, die Speicherprobleme hatten. Die sind alle inzwischen behoben, soweit ich weiß. Was noch offen ist (und mich eine Menge Zeit und Nerven gekostet hat, bis Alaska das bestätigt hat): Wenn man den Profiler einbindet, knallt das relativ schnell mit IDSC oder Speicherknappheit. Lt. Alaska soll das mit dem nächsten Update behoben sein. PDR 7369.

Wenn Du also mit dem aktuellen Build der 2.0 arbeitest sollte das von daher sauber laufen können. Außer Du hast da noch was gefunden, was bislang unentdeckt geblieben war.

Nachtrag: Es gibt tatsächlich noch einen über 12 Jahre alten PDR 5993 über ein Speicherleck, der offen ist. Jedes Öffnen einer dbf im ADS kostet 32 Byte (ich glaube das war die Menge). Seitdem ich in Threads zum Ende nicht mehr alle dbf schließe, und beim Threadstart per WorkSpaceList() kontrolliere ob die jeweiligen Tabellen noch vom vorigen Durchlauf offen sind und nur bei Bedarf im ersten Durchlauf öffne, habe ich da erhebliche Ruhe rein gebracht.

Jan

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Mi, 10. Feb 2021 9:16
von ramses
Dominik Krebs hat geschrieben: Mi, 10. Feb 2021 8:39 Wir kämpfen mit diesem Problem nun schon seit mehr als einem Jahr ...
Hallo Dominik

ich habe meine Erfahrungen mit diesem Problem vor Jahren gesammelt, vielleicht sind die wirklich nicht mehr aktuell.
Damals hatte ich auch grosse Probleme. Auf einen Tip hin habe ich dann alle Funktionen aus den Tools3 aus dem Code entfernt und oder und durch in Xbase Code nachgebaute Funtionen unter Verwendung von OT4XB ersetzt. Seither hatte ich nie mehr Probleme.

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Mi, 10. Feb 2021 9:38
von Jan
Carlo,

interessant. Ich habe eher die gegenteilige Beobachtung: Je mehr ot4xb ich raus werfe, um so stabiler werden meine Projekte. Etwas, das Alaska mir mal vor einiger Zeit auch bestätigt hat.

Wobei ich so gut wie keine Tools-Funktionen verwende. Das Problem, die irgend wie ersetzen zu müssen, habe ich also nicht mehr, seitdem ich vor langr Zeit die auch raus geworfen hatte (aus rein praktischen Erwägungen, da ein paar DLL weniger ausliefern zu müssen).

Jan

Re: Diverse Abstürze (Speicherproblem)?

Verfasst: Mi, 10. Feb 2021 9:59
von ramses
Hallo Jan

auf die OT4XB zu verzichten war auch mal ein Projekt das ich wollte. Das ist leider nicht ganz einfach. Für vieles gibt es keinen Ersatz oder es würde zu viele Codeteile betreffen. Ich habe das aufgegeben nachdem ein Bekannter C Programmierer aus dem Source eine lauffähige abgespeckte DLL erzeugen konnte. Evtl. ist die Zuverlässigkeit ja auch abhängig davon welche Funktionen du aus ot4xb verwendest.

Wenn du die aktuellen ADS-DLL die zu deiner Serverversion passen ( axcws.dll ace32.dll ) nimmst ist vielleicht auch das 32-Byte Problem nicht mehr zu sehen.

Dein Weg möglichts keine Tools Funktionen zu verwenden ist ein sehr guter Weg. Er deckt sich auch mit meinen Erlebnissen in MultiThread Programmen.