Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
ich sehe ja auch keinen Fehler - darum war es ja auch nicht so leicht zu finden!
Ich sehe es eher als Schwachstelle (Garbage Collector?)!
Beispiel:

Code: Alles auswählen

for nI := start to ende
	C := alltrim( str( nI ) )
	if .not. empty( g&dateiname->tag&c )
		bla := 0
		s&dateiname->( DbClearFilter() )
		s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == nI ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == nI ) )" ) )
		goto top
...
Wurde jetzt geändert in:

Code: Alles auswählen

if .not. empty( g&dateiname->tag1 )
	bla := 0
	s&dateiname->( DbClearFilter() )
	s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 1 ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 1 ) )" ) )
	goto top
....
if .not. empty( g&dateiname->tag2 )
	bla := 0
	s&dateiname->( DbClearFilter() )
	s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 2 ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 2 ) )" ) )
	goto top
....
if .not. empty( g&dateiname->tag3 )
	bla := 0
	s&dateiname->( DbClearFilter() )
	s&dateiname->( DbSetFilter( {|| ( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 3 ) ) }, "( ( .not. empty( jugendna12 ) ) .and. ( jtag12 == 3 ) )" ) )
	goto top
....
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Beitrag von Jan »

Martin,

vielleicht kannst Du das ja mal an Alaska geben. Damit die etwas Ursachenforschung betreiben können. Mich würde das auch mal interessieren, ich habe nämlich ab und an auch einen Komplettabsturz, so ganz ohne jede Fehlermeldung.

Jan
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jan,
Jan hat geschrieben:vielleicht kannst Du das ja mal an Alaska geben. Damit die etwas Ursachenforschung betreiben können.
nein - da ich ja nur eine "Sub ohne Sup" habe...
Abgesehen davon läuft es jetzt ja.
Und ein Absturz ohne Meldung ist eher untypisch - zumindest eine XPPFATAL müsste es dann geben...
Entscheidend war in meinem Fall der Anfang:
XPPFATAL.LOG hat geschrieben:Module: MOM
Error Codes: EH: 4 Sub: 5(5) OS: 5 XPP: 40
Also MemoryObjectModel -> Zugriff verweigert.
Das gab mir halt zu denken und darum habe ich halt in Richtung Ressourcen/Handles/Heaps gedacht/gesucht.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

das verstehe ich jetzt nicht. Support sehe ich so, dass man Fragen über Lösungen stellen kann. Was Du aber, hast scheint mir irgendwie ein Problem von Xbase++ zu sein und da ist es mir sch......., ob ich einen Support habe oder nicht, wenn ich einen Fehler entdecke, dann sage ich denen Bescheid. Wenn dann der Support glaubwürdig der Meinung ist, es wäre kein Fehler, dann kann man immer noch verhandeln.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
brauchst Du auch nicht :wink:
Ich habe mal in der Knowledgebase gestöbert:
http://www.alaska-software.com/scripts/ ... PDRID=5024
Und das ist auch die Lösung: Keine local und keine private in der Filterbedingung!!
Habe ein Beispiel zum Einsenden an Alaska gebaut und es knallte.
Habe dann mal die Filterbedingung:

Code: Alles auswählen

s&dateiname->( DbSetFilter( {|| ( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == nI ) ) }, "( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == nI ) )" ) )
geändert in:

Code: Alles auswählen

s&dateiname->( DbSetFilter( {|| &("( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == "+alltrim(str(nI))+" ) )") }, "( ( .not. empty( nachzuchtg ) ) .and. ( ntag2 == "+alltrim(str(nI))+" ) )" ) )
und siehe da - es geht!!
Also nicht nur RTFM, sondern auch RTFKB :!:
Gut, dass ich es nicht eingeschickt habe :D

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Kleiner Hinweis noch am Rande: auch publics gehen nicht!
Habe allerdings noch einige Stellen im Programm, wo ich publics im Filter verwende und was bisher funktioniert - scheinbar.
Muss ich dann auch entsprechend ändern!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Beitrag von Christof »

Hallo Martin,
Kleiner Hinweis noch am Rande: auch publics gehen nicht!
ich habe auch an einigen Stellen publics in Filterbedingungen, weil ich gemerkt hatte, dass es mit locals nicht geht. Grundsätzlich scheint das mit publics also zu gehen, oder? Knallt das Programm dann beim zweiten oder dritten Durchlauf wg. Heap etc.?

Gruß

Christof
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Christof,
ja - egal ob private, public oder local (was anderes habe ich nicht versucht). Das Testprogramm von mir schmierte dann ab.
Ich habe noch viele weitere Filter (auch mit local, geht!), die bisher ohne Probleme liefen - die stelle ich jetzt gerade um auf Makro.
Das Problem dabei ist ja, dass der Absturz nicht an der Stelle auftauchen muss, an der das Problem liegt!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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:

Beitrag von Koverhage »

Martin,

bei der Gelegenheit hätte ich

s&dateiname->

in

(dateiname)->

geändert ;-)

Vorteil Macro fällt weg, Private variable entfällt und dürfte etwas schneller sein.

Gruß
Klaus
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Klaus,
ich brauche nicht (dateiname), sondern s(dateiname) - und das geht ja so nicht...
Also: meine DBF heißt SCACIB41.DBF und in dateiname steht CACIB41

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Martin Altmann hat geschrieben:Hallo Klaus,
ich brauche nicht (dateiname), sondern s(dateiname) - und das geht ja so nicht...
Also: meine DBF heißt SCACIB41.DBF und in dateiname steht CACIB41

Viele Grüße,
Martin
Hi,

wie wäre es mit

Code: Alles auswählen

("S"+dateiname)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
ja - oder
dateiname2 := "s" + dateiname
( dateiname2 )->( DbSetFilter(...
Aber es läuft ja so und es gibt keinerlei merkbare Geschwindigkeitseinbußen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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:

Beitrag von Koverhage »

Martin,

das war mir klar, war nur als Beispiel gedacht.
Benutzeravatar
Bertram Hansen
Foren-Moderator
Foren-Moderator
Beiträge: 1015
Registriert: Di, 27. Sep 2005 8:55
Wohnort: 51379 Leverkusen
Hat sich bedankt: 28 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Beitrag von Bertram Hansen »

Hallo zusammen,

ich habe jetzt längere Zeit die Ursache für einen XPPFATAL Error gesucht und bin hier fündig geworden. Dank an Martin. :wink:
Dann habe ich noch ein paar Dinge ausprobiert die ich kurz vorstelle. Vorher muss ich erwähnen, dass ich mir nie groß Gedanken gemacht haben, wenn ich DbSetFilter() mit Variabeln verwendet habe.
Der XPPFATAL Error beim Kunden ist auch nie beim ersten Durchlauf aufgetreten, sondern nur wenn man 3 oder 4 mal das hintereinander aufgerufen hat.


Hier gibt es einen Programmabbruch siehe Alaska PDR ID 5024 bzw. 4657
Dabei ist es egal, ob die Variable nFirma als Parameter übergeben wird oder ob die Variable als LOCAL, PRIVATE oder PUBLIC deklariert wurde.

Code: Alles auswählen

FUNCTION Test1(nFirma)

   SET OPTIMIZE ON
   alias->(dbsetfilter({|| !alias->akdrlf .AND. alias->akfirma = nFirma .AND. !alias->aksperr}))
   MyBrowse()
   alias->(dbclearfilter())
   SET OPTIMIZE OFF
   
RETURN .T.

Wird SET OPTIMIZE OFF verwendet, dann gibt es keine Probleme

Code: Alles auswählen

FUNCTION Test2(nFirma)

   SET OPTIMIZE OFF
   alias->(dbsetfilter({|| !alias->akdrlf .AND. alias->akfirma = nFirma .AND. !alias->aksperr}))
   MyBrowse()
   alias->(dbclearfilter())
   SET OPTIMIZE ON
   
RETURN .T.

Hierbei gibt es auch kein Problem, wenn die Filterbedingung 'zusammengebaut' wird. Egal wie dann SET OPTIMIZE steht. Den Tipp habe ich von Eugen bekommen.

Code: Alles auswählen

FUNCTION Test3(nFirma)

   LOCAL bCodeFilter := NIL, cCodeFilter := ""
   
   cCodeFilter := "!alias->akdrlf .AND. alias->akfirma = " + STR(nFirma,2) + " .AND. !alias->aksperr"
   cCodeFilter := "{|| " + cCodeFilter + "}"
   bCodeFilter := &(cCodeFilter)
   
   SET OPTIMIZE ON // OFF
   alias->(dbsetfilter(bCodeFilter))
   MyBrowse()
   alias->(dbclearfilter())
   SET OPTIMIZE OFF // ON
   
RETURN .T.
:wave:
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.

Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Beitrag von AUGE_OHR »

hi,

wie ich immer sagte : SET OPTIMIZE OFF

mich würde mal interessieren ob OPTIMIZE überhaupt was bringt ... hat jemand "Zahlen" als Vergleich ?
gruss by OHR
Jimmy
DelUser01

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Beitrag von DelUser01 »

Ich verwende Standardmäßig immer
Set( _SET_OPTIMIZE , .T. )
außgenommen in Bereichen mit DbSetFilter(..), da ist
Set( _SET_OPTIMIZE , .F. )
und nach DbClearFilter() wieder auf .T.

Hatte auch schon festgestellt dass OPTIMIZE ON mit SET FILTER Probleme macht...

@Jimmy
das Leben ist zu kurz um jede Funktion auf Herz und Nieren zu prüfen...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Programmabsturz (XPPFATAL.LOG) - wahrscheinlich Mem.-problem

Beitrag von AUGE_OHR »

Roland Gentner hat geschrieben: Di, 22. Aug 2017 22:51... um jede Funktion auf Herz und Nieren zu prüfen ...
das war mein erster BUG den ich mit Xbase++ hatte -> er fand keinen Datensatz :shock:

nun waren damals noch viel mehr Cl*pper Apps im gemeinsamen Betrieb und dafür hab ich alles abgeschaltet was Cl*pper nicht kennt. das gilt zumindest für NTX während es bei SixDrive/Comix und CDX weniger Probleme machte. man kann aber SET OPTIMIZE nur global setzten und nicht getrennt für DBFNTX / FOXCDX

sicherlich verliert man mit OFF Performance aber was Geschwindigkeit angeht steigt die durch neue Hardware sicherlich viel mehr als die Cache Tricks welche für HDD und 10mBit Netzwerke notwendig wahren.
gruss by OHR
Jimmy
Antworten