Nicht reprodzierbarer Fehler/Module: MOM/Not...[ERLEDIGT]

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
ingo
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Fr, 19. Okt 2007 10:20
Wohnort: Lüneburg
Danksagung erhalten: 1 Mal
Kontaktdaten:

Nicht reprodzierbarer Fehler/Module: MOM/Not...[ERLEDIGT]

Beitrag von ingo »

Moin!
Ich versuche einem FATAL ERROR auf die Spur zu kommen, der offenbar mit ADS im Zusammenhang steht - vielleicht ist ja schon mal jemand darüber gestolpert.

Siehe Quellcode-Auszug:
Das betreffende Programm läuft i.d.R. fehlerfrei (in einer "Massenverarbeitung mehrere hundert bis tausend mal) durch die Methode ::Convert_To_CWR_Zeichensatz( cString ).
Die Klasse CWR_Std_Class verwende ich als "Vaterklasse" (man verzeihe mir die vermutlich schlimme Begriffsverwendung) für diverse andere Klassen - die die Methoden verwenden, u.a. die Problem-Methode "Convert_To_CWR_Zeichensatz".
In CWR_Std_Class.PRG wird eine include-Datei (IKS_CWR.CH) verwendet, in der lediglich ein Array "aCWR_ZEICHENTABELLE" definiert ist.

Die Methode Convert_To_CWR_Zeichensatz ersetzt lediglich Zeichen in einem gegebenen String in einer FOR...NEXT-Schleife über das Array.

Das Programm stürzt wie gesagt nicht reproduzierbar nach einer unterscheidlichen Anzahl der Durchläufe der Methode ab, in einer der beiden Zeilen:

Code: Alles auswählen

FOR i = 1 TO LEN( aCWR_ZEICHENTABELLE )   // <- Abbruch-Fehler in dieser Zeile oder der nächsten!
           cRet = STRTRAN( cRet, aCWR_ZEICHENTABELLE[i,1], aCWR_ZEICHENTABELLE[i,2] )
NEXT i
Ich vermute einen Zusammenhang mit ADS, weil:
- Wenn der lokale ADS verwendet wird, kommt es nicht zum Absturz
...wobei ich nicht 100%ig sicher bin. Ich erinnere mich an sehr seltene Abstürze zu denen ich kein XPPFATAL.LOG gesucht habe. Es kam beim Testen aber so solchen Abstürzen, wenn ich mich recht erinnere.
- Wenn der "echte" ADS (Version 9 und 11) läuft, kommt es fast immer zum Absturz
Der Absturz erfolgt bei der Verarbeitung "größerer" Datenmengen, wenn dier Methode aber schon mehrere hundert mal ausgeführt wurde.

Ich habe den Zugriff auf das Array, das die zu ersetzenden Zeichen und die Ersatzzeichen enthält so verändert, dass das Array, das in der .CH-Datei beim Laden der Klasse einmalig in ein (gleiches) Klassenvariablen-Array eingelesen wird. Dann tritt der Fehler (scheinbar) nicht auf.

Kennt jemand so ein Problem und wenn ja - ist es durch den Workaround gelöst?
Gibt es sonst Probleme mit defines ggf. speziell mit Arrays?
Dateianhänge
Auszug.prg
Auszug aus der PRG-Datei
(5.86 KiB) 245-mal heruntergeladen
XPPFATAL.LOG
Fehlerprotokoll
(2.77 KiB) 254-mal heruntergeladen
Zuletzt geändert von ingo am Do, 15. Aug 2013 10:08, insgesamt 1-mal geändert.
Schönen Gruß, Ingo
Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 139
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch
Hat sich bedankt: 5 Mal

Re: Nicht reprodzierbarer Fehler/Module: MOM/Not recoverable

Beitrag von Schubi »

Dass der ADS was damit zu hat, halte ich für unwahrscheinlich.
1. Speicher das #define vorher in eine LOCAL - Variable um.
2. Setze ein sleep(0) in die FOR NEXT - Schleife.
Ich denke, damit sollten die Probleme gelöst sein.
Grüße Steffen
Benutzeravatar
Schubi
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 139
Registriert: Mi, 05. Okt 2005 15:10
Wohnort: Wiesloch
Hat sich bedankt: 5 Mal

Re: Nicht reprodzierbarer Fehler/Module: MOM/Not recoverable

Beitrag von Schubi »

Das mit der Klassenvariable habe ich erst zu spät gelesen:
Genau das ist das Richtige!
Irgendwo habe ich mal gelesen, dass es einen Geschwindigkeitsvorteil bringt, wenn #defines bei Mehrfachverwendung vorher umgespeichert werden.
Grüße Steffen
Benutzeravatar
ingo
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Fr, 19. Okt 2007 10:20
Wohnort: Lüneburg
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Nicht reprodzierbarer Fehler/Module: MOM/Not recoverable

Beitrag von ingo »

Moin Steffen,
dann wundert mich nur, dass es schneller ist, ein Define in eine local- oder Klassenvar umzuschaufeln.
Ich dachte bisher immer, dass man defines nutzen solle um Geschwindigkeitsvorteile zu erreichen - weil es einfach schneller geht, wenn der Compiler eine Konstante statt einer Variablen zu verarbeiten hat.
Jedenfalls habe ich das Programm heute schon ein paar mal mit der Klassenvariable laufen lassen und es gab keine Abbrüche mehr.
Dass der ADS nix damit zu tun hat, kann ich mir auch vorstellen - aber nicht wirklich erklären. Der Absturz muss dann wohl damit zusammen hängen, dass die Verarbeitung über's Netz langsamer läuft oder so(?)
Schönen Gruß, Ingo
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Nicht reprodzierbarer Fehler/Module: MOM/Not recoverable

Beitrag von Koverhage »

Wenn es auch um die Geschwindigkeit geht, würde ich den LEN Befehl aus der For Schleife entfernen.
Also
nLaenge := LEN(myarray)
for i := 1 to nLaenge

Was mich wundert das es überhaupt funktioniert
cRet = STRTRAN(......
Ist doch keine Zuweisung sondern ein Vergleich ?
Gruß
Klaus
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Nicht reprodzierbarer Fehler/Module: MOM/Not recoverable

Beitrag von UliTs »

Koverhage hat geschrieben:...
Was mich wundert das es überhaupt funktioniert

Code: Alles auswählen

cRet = STRTRAN(......
Ist doch keine Zuweisung sondern ein Vergleich ?
So lautet die alte Clipper-Syntax, Claus.
Sie ist weiterhin gültig und entspricht dem

Code: Alles auswählen

cRet := StrTran(.....
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
ingo
UDF-Programmierer
UDF-Programmierer
Beiträge: 62
Registriert: Fr, 19. Okt 2007 10:20
Wohnort: Lüneburg
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Nicht reprodzierbarer Fehler/Module: MOM/Not recoverable

Beitrag von ingo »

Als Abschluss-Info:
Warum es zu dem Fehler kommt, weiß ich zwar nicht, aber immerhin hilft es (wie oben beschrieben) das in der .ch-Datei definierte Array zur Laufzeit in eine Klassenvariable zu übernehmen.
(Interessant wär's natürlich trotzdem zu wissen, was genau das Problem ist...)
Schönen Gruß, Ingo
Antworten